Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EventQueue.invokeLater与Thread.start_Java_Multithreading_Swing - Fatal编程技术网

Java EventQueue.invokeLater与Thread.start

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应用程序的两个选

对于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());
    }

}
简明扼要。这个班做三件事

  • 将Swing应用程序置于EDT上
  • 实例化Swing应用程序模型
  • 实例化Swing应用程序JFrame

  • 您可以在我的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());
        }
    
    }