首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >invokeAndWait方法在SwingUtilities中的应用

invokeAndWait方法在SwingUtilities中的应用
EN

Stack Overflow用户
提问于 2011-03-31 12:35:01
回答 2查看 37.9K关注 0票数 24

请解释一下invokeAndWait()方法的用法,我无法理解。非常清楚地解释了它。,如果你用一个例子来尝试,将会有很大的帮助。

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

关于this有什么不清楚的?

下面是一个修改后的用法示例:

代码语言:javascript
复制
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();
    }
}

输出:

代码语言:javascript
复制
Hello World on Thread[AWT-EventQueue-0,6,main]
Finished on Thread[Thread-0,5,main]

为什么这很重要?

导致在AWT事件调度线程上同步执行doHelloWorld.run()。这个调用会阻塞,直到所有挂起的AWT事件都被处理,然后(然后) doHelloWorld.run()返回。当应用程序线程需要更新GUI时,应该使用此方法。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-31 13:09:36

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

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

在Swing中,这个特殊的GUI线程称为事件调度线程( Event,或EDT )。只要显示了Swing顶层组件,就会启动它,它基本上是一个工作线程,它拥有一个一个又一个执行的事件对象的FIFO队列。

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

现在,对于finish:invokeAndWait() 将传递给它的 Runnable 放置到EDT事件队列中,并等待EDT执行它。当非GUI线程需要做一些影响GUI的事情时,应该使用,但也需要等到实际完成之后才能继续。如果您只想做一些影响GUI但不关心什么时候完成的事情,则应该使用invokeLater()

票数 57
EN

Stack Overflow用户

发布于 2013-09-11 20:06:02

我在JTable中也遇到了类似的问题。程序在"scrollRectToVisible“方法中的某个位置被阻塞。我已经替换了调用,将其封装在一个invokeLater调用中。invokeAndWait没有解决我的块问题。

代码语言:javascript
复制
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            table.scrollRectToVisible(r);
        }

    });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5499921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档