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

Ren*_*hya 15 java swingworker

使用SwingWorker代替Thread或有Runnable什么好处?

use*_*421 15

我认为SwingWorker的文档非常好:

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

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

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

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

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

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


Pet*_*aný 12

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


duf*_*ymo 12

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

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

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

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


use*_*421 6

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