invokeLater 与 invokeAndWait

测试代码:

public static void main(String[] args) {
		
		SwingUtilities.invokeLater(new Runnable(){
			@Override
			public void run() {
				try {
					Thread.sleep(5000);//休眠5秒
				} catch (Exception e) {
					e.printStackTrace();
				}
				System.out.println("invokeLater:"+Thread.currentThread().getName());
			}
		});
		System.out.println("main1:"+Thread.currentThread().getName());
		try {
			SwingUtilities.invokeAndWait(new Runnable(){
				@Override
				public void run() {
					try {
						Thread.sleep(5000);//休眠5秒
					} catch (Exception e) {
						e.printStackTrace();
					}
					System.out.println("invokeAndWait:"+Thread.currentThread().getName());
				}
			});
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("main2:"+Thread.currentThread().getName());
	}
 

执行结果:

main1:main

invokeLater:AWT-EventQueue-0

invokeAndWait:AWT-EventQueue-0

main2:main

 

小结:

1、invokeLater和invokeAndWait都是将run方法中的代码交给同一个线程(即EDT,事件分发线程)去处理,按照顺序排队执行。

2、invokeLater方法,将run方法交给EDT后,接着直接返回(不关注是否执行了),main方法继续执行。

3、invokeAndWait方法,将run方法交给EDT后,会等待run方法执行完,main方法才继续向下执行。

 

补充:

1、事件分发线程(EDT)只有一个,耗时的操作最好放在一个单独的线程中去执行,不要在EDT中执行。

2、Swing组件的更新一定要在EDT线程中进行。

3、例子:

为按钮设置监听器——点击按钮——产生按钮点击事件——该事件会进入事件队列(Event Queue)等待执行——事件分发线程(EDT)从事件队列中一个一个的顺序取出——然后执行相应的事件处理方法(监听器中的方法)

 

http://huangqiqing123.iteye.com/blog/1679036

 

你可能感兴趣的:(swing,invokeLater,invokeAndWait)