Java EventQueue.invokeLater与Thread.start
对于Swing应用程序,我们使用Java EventQueue.invokeLater与Thread.start,java,multithreading,swing,Java,Multithreading,Swing,对于Swing应用程序,我们使用EventQueue.invokeLater()有什么原因吗?Thread.start()不应该以同样的方式工作吗 Thread.start的另一个优点是,我们可以告诉线程作为EventQueue中断。invokeLater不向我们提供Thread对象。您应该使用EventQueue.invokeLater进行所有GUI更新,因为Swing在某种程度上是单线程的。看 您可以启动线程进行计算等,但应使用invokeLater更新GUI。启动Swing应用程序的两个选
EventQueue.invokeLater()
有什么原因吗?Thread.start()
不应该以同样的方式工作吗
Thread.start的另一个优点是,我们可以告诉线程作为
EventQueue中断。invokeLater
不向我们提供Thread
对象。您应该使用EventQueue.invokeLater进行所有GUI更新,因为Swing在某种程度上是单线程的。看
您可以启动线程进行计算等,但应使用invokeLater更新GUI。启动Swing应用程序的两个选项是:
EventQueue.invokeLater()
及
我的偏好是使用SwingUtilities。他们都把runnable放在(EDT)上。你不需要EDT的句柄
您的代码要么在EDT上,要么调用invokeLater()方法会将runnable放在EDT上。您可以使用SwingUtilities.isEventDispatchThread()方法调用确定任一条件
start()方法用于您自己的工作线程。或者,如果愿意,可以将该类用于自己的Swing工作线程
这是我用来启动我编写的每个Swing应用程序的样板文件
package com.ggl.game2048;
import javax.swing.SwingUtilities;
import com.ggl.game2048.model.Game2048Model;
import com.ggl.game2048.view.Game2048Frame;
public class Game2048 implements Runnable {
@Override
public void run() {
new Game2048Frame(new Game2048Model());
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Game2048());
}
}
简明扼要。这个班做三件事
您可以在我的Java文章中看到其余部分。因此,如果您不进行任何GUI更新,但进行“模型”更新,那么使用Thread.start还是仍然使用EventQueue是可以的。il?@Archimedes Trajano:如果您的模型更新会长时间阻止GUI,您应该在单独的线程中更新模型。“长时间”超过200毫秒。不,这更像是将状态文本设置为“停止…”。但是这样做听起来没问题。
因此,如果您不进行任何GUI更新,但进行“模型”更新,则可以使用Thread。start
-否,因为对模型的更改会导致GUI组件重新绘制自身。@camickr对于所有swing模型来说都是完全正确的,这就是应该的!但他们似乎在谈论一种“残废模式”,即不通知任何听众的模式,参见吉尔伯特的例子,因此可能是一种边缘情况,只要控制器确保EDT上的更新,谢谢,这通常是我做事情的方式,但这不适用于我的问题。顺便说一句,很好地实现了2048@Archimedes特拉亚诺:答案不仅针对你,也针对所有后来发现这个问题的人。还有一个叫喊声(尽管有些人称之为被动;-)模型实现当模型的状态发生变化时,模型会通知其关联的视图和控制器。SwingUtilities.invokeLater(…)
只委托给EventQueue.invokeLater(…)
。看不到您喜欢使用什么备份SwingUtilities
…顺便说一句,您不能为“自己的swing工作线程”使用javax.swing.Timer
类。Swing的Timer
仅在EDT内提供ActionEvent
s。
package com.ggl.game2048;
import javax.swing.SwingUtilities;
import com.ggl.game2048.model.Game2048Model;
import com.ggl.game2048.view.Game2048Frame;
public class Game2048 implements Runnable {
@Override
public void run() {
new Game2048Frame(new Game2048Model());
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Game2048());
}
}