【问题标题】:What does EventQueue.invokeLater do and that vs start() Thread?EventQueue.invokeLater 和 start() 线程做什么?
【发布时间】:2014-06-26 21:45:02
【问题描述】:
【问题讨论】:
标签:
java
multithreading
swing
invokelater
eventqueue
【解决方案1】:
Swing API 是单线程的:您只能从 Swing 线程调用 Swing 组件上的方法。
您的应用程序中可以有多个线程,但是当另一个线程需要与 swing 组件交互时,它需要使用 EventQueue.invokeLater 进行交互。这可确保Runnable 在正确的线程上运行。
启动你自己的Thread 没有这个效果(在Swing线程上运行),所以它不是一个替代方案。如果这样做,可能会导致数据损坏、屏幕更新不正确等。这可能是暂时的,但也可能无法修复。
但是invokeLater 方法不能替代运行您自己的线程或使用线程池,因为传递给它的所有Runnables 都是按顺序执行的,而不是并行执行的。
【解决方案2】:
我看到了一些关于线程的东西,实现了 Runnable
忘记你曾经见过。这是一个应该被弃用的坏主意。如果你想在 java 程序中创建一个显式线程,可以这样做:
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
...code to be run in the thread goes here...
}
});
我不会在这个领域解释为什么,但请相信我。现在就养成一个好习惯。
这是做什么的? ...invokeLater...
swing 包创建一个响应“事件”(鼠标点击、按键等)的线程,并且您为 swing 编写的许多代码作为该线程调用的“处理程序”运行。
有时,您的处理程序想要做一些在调用它的上下文中不允许/没有意义的事情。我不是一个swing程序员,所以我没有一个方便的例子,但解决方案是调用invokeLater()
EventQueue invokeLater(new Runnable() {
@Override
public void run() {
...code that you want to run "later"...
}
});
这会将一个新事件发布到事件队列中,当事件线程将其从队列中取出时,它将执行您提供的 run() 方法。