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 Swing中的线程,应用程序中三种方法概述_Java_Multithreading_Swing_Desktop - Fatal编程技术网

Java Swing中的线程,应用程序中三种方法概述

Java Swing中的线程,应用程序中三种方法概述,java,multithreading,swing,desktop,Java,Multithreading,Swing,Desktop,我在桌面swing应用程序中使用下面的代码,但我没有太多的专业知识 使用线程,因为我是一个随意的web程序员,处理swing不是我的拿手好戏 我想知道是否有更好的方法来控制我的3个任务,我需要在我的应用程序中为线程并行运行它们 SwingUtilities.invokeLater(new Runnable() { public void run() { task 1 } });

我在桌面swing应用程序中使用下面的代码,但我没有太多的专业知识 使用线程,因为我是一个随意的web程序员,处理swing不是我的拿手好戏

我想知道是否有更好的方法来控制我的3个任务,我需要在我的应用程序中为线程并行运行它们

    SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            task 1                
         }
    });


    Runnable r;
    r = new Runnable() {

        public void run() {
            task 2                  
        }
    };
    EventQueue.invokeLater(r);


    Thread worker = new Thread() {

        public void run() {
            task 3                 
        }
    };

    worker.start();

谢谢

你想做什么?您的线程是在Swing GUI中运行还是独立于GUI

如果线程正在使用Swing用户界面执行某些操作,则应该使用,因为这只能从。Swing是单线程的。(您的任务1和2)

如果您完全在后台执行某些操作,例如编写大型XML文件,则可以在后台执行。(任务3)但是您仍然可以使用
invokeLater()
与Swing GUI通信

另一种选择是,如果希望定期运行线程,例如每5分钟运行一次,则可以使用。或者如果它独立于Swing GUI

可能值得一读:

Swing程序员处理以下类型的线程:

  • 初始线程,执行初始应用程序代码的线程
  • 事件分派线程,其中执行所有事件处理代码。与Swing框架交互的大多数代码也必须在此线程上执行
  • 工作线程,也称为后台线程,用于执行耗时的后台任务
#1和#2是相同的。您应该使用数字1,因为这是API中众所周知的部分

使用#1还是#3取决于以下几点:

它是否对用户界面或其支持模型进行了更改? 如果是,请使用#1

这是一项长期运行的任务: 如果是,请使用#3

如果它是一个长时间运行的任务,最终将修改用户界面或其支持模型,则在单独的线程中执行长时间运行的任务,然后调用incokeLater更新用户界面

此外,不要每次都创建一个新线程,而是使用ExecutorService以便可以重用线程


它可能会变得更复杂一点,例如,如果您当前在事件线程中(即:在
ActionListener.actionPerformed()
),那么您不需要(如in-should-not)调用invokeLater,但要点就在上面。

同意除“如in-should-not”之外的所有内容侦听器回调中的调用调用器(通常)保证在EDT上运行:这样做会在所有挂起事件完成后调用任务,因此会影响执行顺序。如果您执行的是长时间运行的任务,最终会修改用户界面,那么SwingWorker是创建自己的线程或直接使用执行者服务的好选择。