请解释一下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]为什么这很重要?
导致在AWT事件调度线程上同步执行doHelloWorld.run()。这个调用会阻塞,直到所有挂起的AWT事件都被处理,然后(然后) doHelloWorld.run()返回。当应用程序线程需要更新GUI时,应该使用此方法。
据我所知,这基本上是一个瓶颈,迫使GUI更新由单个线程同步执行,而不是由多个线程异步执行,这可能是不安全的。
发布于 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()。
发布于 2013-09-11 20:06:02
我在JTable中也遇到了类似的问题。程序在"scrollRectToVisible“方法中的某个位置被阻塞。我已经替换了调用,将其封装在一个invokeLater调用中。invokeAndWait没有解决我的块问题。
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
table.scrollRectToVisible(r);
}
});https://stackoverflow.com/questions/5499921
复制相似问题