SwingUtilities中的invokeAndWait方法

请解释SwingUtilities中的invokeAndWait()方法,对此我无法理解。

如果您尝试使用示例,那将有很大的帮助。

什么是不太清楚这个?

这是修改后的用法示例:

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]

为什么这很重要?:

使doHelloWorld.run()在AWT事件分配线程上同步执行。该调用将阻塞,直到处理完所有未决的AWT事件,然后再返回doHelloWorld.run()。当应用程序线程需要更新GUI时,应使用此方法。

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

回答:

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

基本上, 。这是因为经验表明,多线程GUI无法正确实现。

。它在显示Swing顶级组件后立即启动,并且

当需要绘制或更新Swing

GUI时,JRE将事件放在EDT队列上。导致调用侦听器的用户操作从EDT队列上的事件开始。并且(这是重要的部分)您的程序所做的所有更改GUI的操作(例如注册侦听器,添加/删除GUI组件或更改GUI显示的模型数据)都必须放在EDT队列中,否则GUI可以获取损坏了。

现在结束: 当非GUI线程需要执行一些会影响GUI的操作时,还需要等到它实际完成后,才能继续使用它。如果您只想做一些会影响GUI的事情,但不在乎它何时完成,则应改用invokeLater()

以上是 SwingUtilities中的invokeAndWait方法 的全部内容, 来源链接: utcz.com/qa/404359.html

回到顶部