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

使用SwingWorker而不是ThreadRunnable什么好处?

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

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

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

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

我认为SwingWorker的文档非常好:

一个抽象类,用于在专用线程中执行冗长的GUI交互任务。

使用Swing编写multithreading应用程序时,需要记住两个约束:(有关更多详细信息,请参阅如何使用线程 ):

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

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

SwingWorker适用于需要在后台线程中运行长时间运行任务并在完成或处理时为UI提供更新的情况。 SwingWorker的子类必须实现doInBackground()方法来执行后台计算。

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

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

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