java – 在SwingUtilities中的invokeAndWait方法 - 代码日志

java – 在SwingUtilities中的invokeAndWait方法

请在SwingUtilities中解释invokeAndWait()方法。我无法理解这一点。
解释很清楚。如果您尝试一个例子,这将是非常有帮助的。

编辑添加@ noob的扩展问题:

this还不清楚?

这是一个修改后的使用示例:

import javax.swing.SwingUtilities;

public class InvokeAndWaitStuff 
{
    public static void main(String[] args)
    {
        final Runnable doHelloWorld = new Runnable() {
             public void run() {
                 System.out.println("Hello World on " + Thread.currentThread());
             }
         };

         Thread appThread = new Thread() {
             public void run() {
                 try {
                     SwingUtilities.invokeAndWait(doHelloWorld);
                 }
                 catch (Exception e) {
                     e.printStackTrace();
                 }
                 System.out.println("Finished on " + Thread.currentThread());
             }
         };
         appThread.start();
    }
}

输出:

Hello World on Thread[AWT-EventQueue-0,6,main]
Finished on Thread[Thread-0,5,main]

为什么这很重要?

Causes doHelloWorld.run() to be
executed synchronously on the AWT
event dispatching thread. This call
blocks until all pending AWT events
have been processed and (then)
doHelloWorld.run() returns. This
method should be used when an
application thread needs to update the
GUI.

据我所知,这基本上是一个瓶颈,迫使GUI更新由单个线程同步执行,而不是由多个线程异步执行,这可能是不安全的。

要了解invokeAndWait()的作用,首先需要了解Swing的事件/线程模型。

基本上,以任何方式影响GUI的一切都必须在单个线程上发生。这是因为经验表明,多线程GUI是不可能正确的。

在Swing中,这个特殊的GUI线程称为事件调度线程,或EDT。一旦显示了Swing顶级组件,它就会启动,它基本上是一个工作线程,它具有一个接一个执行的事件对象的FIFO队列。

当需要绘制或更新Swing GUI时,JRE会在EDT队列上放置一个事件。导致侦听器被调用的用户操作作为EDT队列上的事件启动。并且(这是重要的部分),您的程序所做的更改GUI(如注册侦听器,添加/删除GUI组件或更改GUI显示的模型数据)的所有内容必须放在EDT队列中,或者GUI可以获取损坏。

现在完成:invokeAndWait()将您传递给它的Runnable放入EDT事件队列中,并等待,直到EDT执行它。当非GUI线程需要做一些影响GUI的事情时,应该使用这一点,但是还需要等到它实际完成才能继续。如果你只是想做一些影响GUI的事情,但是当它完成的时候不用关心,你应该使用invokeLater()。

http://stackoverflow.com/questions/5499921/invokeandwait-method-in-swingutilities

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:java – 在SwingUtilities中的invokeAndWait方法