EventQueue.invokeLater与Thread.start

时间:2014-04-24 14:08:00

标签: java multithreading swing

对于Swing应用程序,我们使用EventQueue.invokeLater()是否有原因?应该Thread.start()以同样的方式工作吗?

Thread.start的另一个优点是我们有一种告诉线程中断的方法,因为EventQueue.invokeLater没有为我们提供Thread对象。

2 个答案:

答案 0 :(得分:3)

您应该使用EventQueue.invokeLater进行所有GUI更新,因为Swing在某种程度上是单线程的。见http://docs.oracle.com/javase/6/docs/api/javax/swing/package-summary.html#threading

您可以启动线程来进行计算等,但应该使用invokeLater更新GUI。

答案 1 :(得分:2)

启动Swing应用程序的两个选项是:

EventQueue.invokeLater()

SwingUtilities.invokeLater()

我的偏好是使用SwingUtilities。他们都将runnable放在Event Dispatch thread(EDT)上。你不需要处理EDT。

你的代码在EDT上,或者另一个invokeLater()方法的调用将把runnable放在EDT上。您可以使用SwingUtilities.isEventDispatchThread()方法调用确定任一条件。

Thread.start()方法适用于您自己的工作线程。或者,如果您愿意,可以将javax.swing.SwingWorker类用于您自己的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());
    }

}

简短而重要。这堂课做了3件事。

  1. 将Swing应用程序放在EDT上。
  2. 实例化Swing应用程序模型。
  3. 实例化Swing应用程序JFrame。
  4. 您可以在我的Java文章中看到2048 Swing application的其余部分。