2010-05-13 126 views
9

SwingWorker用于以下目的的区别:爪哇 - SwingWorker类和SwingUtilities.invokeLater()

  • 对于在不同的线程中运行长时间运行的任务,以防止从GUI不响应
  • 对于具有通过在任务通过done()方法结束时的长时间运行的任务产生的结果更新GUI。
  • 对于具有产生并通过用publish()process()方法的帮助下,任务公布的中间结果不时更新GUI时间。

SwingUtilities.invokeLater()可以如下执行上述任务:

  • 而不是从EDT执行SwingWorker.execute()的方法,我们可以执行ExecutorService.submit(new MyRunnable()),因为它也将创造另一个线程可以执行长时间运行的任务。
  • 对于在任务结束时更新GUI,我们可以在任务结束时把代码(写在情形1的done()方法)SwingUtilites.invokeLater(new RunnableToExecuteDoneMethodCode())
  • 为了在任务中更新GUI,我们可以在case1中的方法publish()方法中放置代码(写在case1的process()方法中)SwingUtilites.invokeLater(new RunnableToExecuteProcessMethodCode())

我问这个问题,因为问题Java - SwingWorker - Can we call one SwingWorker from other SwingWorker instead of EDT规定的问题可以通过SwingUtilities.invokeLater()来解决,但不能与SwingWorker

+1

我不太清楚 '问题' 是什么。 – akf 2010-05-13 19:11:09

+0

@akf如果你不确定,那就离开吧。简单:) – 2010-05-13 19:19:59

+0

您引用的问题可以通过使用SwingWorker解决。在那里看到我的答案。 – 2010-05-13 19:45:43

回答

6

SwingWorker来解决是一个辅助类 - 这是不是你需要使用它,但使用它比手工完成相同的工作更简单和更清晰。 (这也使得检查进度更加容易。)请注意,它增加了第6版 - 在此之前有些人习惯在Swing教程中定义一个简单的类或做类似你提到的那些步骤。

+0

+1便利,有一个源兼容回港为Java 5 https://swingworker.dev.java.net/ – trashgod 2010-05-13 21:29:17

1

的1.6+ SwingWorker类的一个重要特征是doInBackground之间进行()的EDT(事件指派线程),差()。您应该像doWorkInsideEDT()一样将doInBackground()视为doWorkOutsideEDT()和done()。运行这个教学示例来看看不同的。

System.out.println("TID=" + Thread.currentThread().getId() + " (main)"); 
    final SwingWorker<String, String> x = new SwingWorker<String, String>() { 
     @Override 
     protected String doInBackground() throws Exception { 
      final long tid = Thread.currentThread().getId(); 
      System.out.println(""); 
      System.out.println("TID=" + tid + " doInBackground() isEventDispatchThread=" + SwingUtilities.isEventDispatchThread()); 
      System.out.println("Long running code goes here."); 
      return ""; 
     } 

     @Override 
     protected void done() { 
      final long tid = Thread.currentThread().getId(); 
      System.out.println(""); 
      System.out.println("TID=" + tid + "   done() isEventDispatchThread=" + SwingUtilities.isEventDispatchThread()); 
      System.out.println("GUI updates/changes go here."); 
     } 
    }; 
    x.execute(); 
    x.get(); 

输出:

TID=1 (main) 

TID=9 doInBackground() isEventDispatchThread=false 
Long running code goes here. 

TID=16   done() isEventDispatchThread=true 
GUI updates/changes go here.