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

Ber*_*era 4 java desktop swing multithreading

我在桌面摇摆应用程序中使用了代码,我没有太多的线程专业知识,因为我是一个休闲的网络程序员,处理摇摆不是我的糖果......

我想知道是否有更好的方法来控制我的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();
Run Code Online (Sandbox Code Playgroud)

谢谢!

Rev*_*nzo 7

#1和#2是相同的.您应该使用数字#1,因为这是API的众所周知的部分.

是否使用#1或#3取决于以下内容:

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

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

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

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

它可能会变得有点复杂,例如,如果你当前在事件线程中(即:在一个ActionListener.actionPerformed(),那么你不需要(因为不应该)调用invokeLater,但它的要点是在上面.

  • 如果您执行最终将修改用户界面的长时间运行任务,那么SwingWorker是创建自己的线程或直接使用执行程序服务的不错选择. (2认同)

Jon*_*nas 6

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

invokeLater()如果线程正在使用Swing用户界面执行某些操作,则应该使用,因为这只能通过Event Dispatch Thread完成.Swing是单线程的.(你的任务1和2)

如果你在后台完全做某事,例如编写一个大的XML文件,可以在后台线程中完成.(您的任务3)但您仍然可以使用Swing GUI进行通信invokeLater().

另一种选择是如果你想定期运行一个线程,例如每隔5分钟,就可以使用一个TimerTask.或者,如果它独立于Swing GUI java.util.TimerTask.

Swing中的并发可能值得一读:

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

  • 初始线程,执行初始应用程序代码的线程.
  • 事件调度线程,执行所有事件处理代码.大多数与Swing框架交互的代码也必须在此线程上执行.
  • 工作线程,也称为后台线程,执行耗时的后台任务.