为什么选择SwingWorker?为什么不只是Thread或Runnable?

时间:2010-12-23 11:58:02

标签: java swingworker

使用SwingWorker代替ThreadRunnable有什么好处?

4 个答案:

答案 0 :(得分:14)

我认为SwingWorker的文档非常好:

  

执行冗长的抽象类   专用的GUI交互任务   线程。

     

编写多线程时   使用Swing的应用程序有两种   要记住的约束:(参考   How to Use Threads了解详情):

     
      
  • 不应在Event Dispatch Thread上运行耗时的任务。   否则应用程序变为   不响应。
  •   
  • 应在Event Dispatch Thread上访问Swing组件   仅
  •   
     

这些约束意味着GUI   应用时间密集   计算需要至少两个线程:   1)执行冗长的线程   任务和2)事件调度线程   (EDT)用于所有与GUI相关的活动。   这涉及到线程间   沟通可能很棘手   实施

     

SwingWorker专为各种情况而设计   你需要长时间运行的地方   任务在后台线程中运行   在何时提供UI的更新   完成或处理时。子类   SwingWorker必须实现   doInBackground()方法执行   背景计算。

当然你可以使用Thread,Runtime和SwingUtilities(invokeLater)来做到这一点,但使用SwingWorker类更容易,而且可能更不容易出错。

答案 1 :(得分:12)

SwingWorker负责处理一些细节,例如运行任务时的UI更新,或任务完成后。这些必须在Swing EDT线程上执行。你可以自己做,但这样做太容易了。

答案 2 :(得分:12)

Thread和Runnable是Java 1.0的一部分;他们和那时候一样好。

从那时起,新的并发类提炼了所有关于多线程的知识(谢谢Doug Lea等人)。编写多线程代码非常困难。新的并发类(包括SwingWorker)试图使这更容易。

首先注意强类型的泛型。内置了一种机制来发布和处理最终结果和中间结果。

可以使用Thread和Runnable模仿这些,但是SwingWorker已经为你完成了。

答案 3 :(得分:6)

SwingWorker封装了与事件调度线程的正确交互。 Runnable没有。