请解释SwingUtilities中的invokeAndWait()方法.我无法理解这一点. 非常清楚地解释一下. 如果你尝试一个例子,那将是很有帮助的.
编辑添加@ noob扩展问题:
什么是不太清楚这个?
这是一个修改过的用法示例:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Hello World on Thread[AWT-EventQueue-0,6,main]
Finished on Thread[Thread-0,5,main]
Run Code Online (Sandbox Code Playgroud)
为什么这很重要?:
导致doHelloWorld.run()在AWT事件派发线程上同步执行.此调用将阻塞,直到处理完所有待处理的AWT事件,并且(然后)doHelloWorld.run()返回.当应用程序线程需要更新GUI时,应使用此方法.
据我所知,这基本上是一个瓶颈,迫使GUI更新由单个线程同步执行,而不是由多个线程异步执行,这可能是不安全的.
Mic*_*rdt 52
要了解invokeAndWait()它的作用,首先需要了解Swing的事件/线程模型.
基本上,以任何方式影响GUI的所有内容都必须在单个线程上进行.这是因为经验表明多线程GUI是不可能正确的.
在Swing中,这个特殊的GUI线程称为Event Dispatch Thread,或EDT.它一旦显示Swing顶级组件就会启动,并且它基本上是一个工作线程,它具有一个接一个地执行的事件对象的FIFO队列.
当需要绘制或更新Swing GUI时,JRE会在EDT队列上放置一个事件.导致侦听器被调用的用户操作作为EDT队列上的事件启动.并且(这是重要的部分)您的程序所做的一切都会改变GUI(比如注册监听器,添加/删除GUI组件或更改GUI显示的模型数据)必须放在EDT队列中,或者GUI可以获得损坏.
现在结束:invokeAndWait()将Runnable你传递给EDT事件队列并等待直到EDT执行它.当非GUI线程需要做一些影响GUI的事情时,应该使用它,但是还需要等到实际完成它才能继续.如果你只是想做一些影响GUI的事情,但是在完成时不关心,你应该改用invokeLater().
| 归档时间: |
|
| 查看次数: |
30646 次 |
| 最近记录: |