2011-03-31 115 views
2

unlike SwingUtilities.invokeAndWait(), the event thread is permitted to call SwingUtilities.invokeLater()。我无法明白这一点。这个说法是什么意思

请帮我这个。

+1

你被原谅了,因为从技术上讲这是不好的语法。它应该是:“与SwingUtilities.invokeAndWait()不同,SwingUtilities.invokeLater()可以由事件线程调用。” – DJClayworth 2011-03-31 18:22:50

回答

7

另一个线程(不是主Swing事件线程)可以调用invokeAndWait等待Swing事件线程准备好运行某个操作。但是,Swing事件线程不能等待自己。因此,它调用invokeLater将该操作放入队列以供稍后执行。

3

不是Java开发人员,我认为如果在事件线程上执行invokAndWait,它将有效地阻止自己。

+1

即使这不是一个错误的猜测,-1总的来说会阻止疯狂的猜测。 – Pops 2011-03-31 16:22:43

2

Source

的invokeAndWait()方法看起来相似,但它有三个重要的语义差别。首先,invokeLater()方法将来会在某个时间异步运行。你不知道它什么时候会真正运行。另一方面,invokeAndWait()方法是同步的:在目标完成执行之前它不会返回。作为一个经验法则,那么应该使用invokeAndWait()方法来读取Swing组件的值或确保在继续执行程序之前屏幕上显示的内容。否则,您可以使用invokeLater()方法。

第二个区别是invokeAndWait()方法本身不能从事件分派线程中调用。运行invokeAndWait()方法的线程必须等待事件分派线程执行一些代码。包括事件分派线程在内的任何线程都不能等待自己做其他事情。因此,如果您从事件派发线程执行invokeAndWait()方法,则会抛出java.lang.Error。这会导致事件分派线程退出(除非您采取了在代码中捕获错误对象的不寻常步骤);反过来,您的整个程序将被禁用。

第三个区别是,如果线程在事件分派线程运行目标之前中断,则invokeAndWait()方法可以抛出InterruptedException,如果Runnable对象抛出运行时异常或错误,则可以抛出InvocationTargetException。

-IvarD