使用SwingWorker
代替Thread
or有什么好处Runnable
?
4 回答
我认为SwingWorker的文档非常好:
一个抽象类,用于在专用线程中执行冗长的 GUI 交互任务。
使用 Swing 编写多线程应用程序时,需要牢记两个约束:( 有关详细信息,请参阅如何使用线程):
- 不应在事件调度线程上运行耗时的任务。否则应用程序变得无响应。
- Swing 组件只能在 Event Dispatch Thread 上访问。
这些约束意味着具有时间密集型计算的 GUI 应用程序至少需要两个线程:1) 一个线程来执行冗长的任务,以及 2) 用于所有与 GUI 相关的活动的事件调度线程 (EDT)。这涉及到难以实现的线程间通信。
SwingWorker 专为需要在后台线程中运行长时间运行的任务并在完成时或在处理时提供 UI 更新的情况而设计。SwingWorker 的子类必须实现 doInBackground() 方法来执行后台计算。
当然,您可以使用 Thread、Runtime 和 SwingUtilities ( invokeLater
) 来做到这一点,但使用 SwingWorker 类更容易并且可能更不容易出错。
SwingWorker 负责处理一些细节,例如运行任务时或任务完成后的 UI 更新。这些必须在 Swing EDT 线程上执行。你可以自己做,但做错太容易了。
Thread 和 Runnable 是 Java 1.0 的一部分;他们和当时一样好。
新的并发类提炼了从那时起所有关于多线程的知识(感谢 Doug Lea 和其他人)。编写多线程代码非常困难。新的并发类,包括 SwingWorker,试图让这更容易。
首先注意强类型的泛型。有一种内置机制可以发布和处理最终结果和中间结果。
可以使用 Thread 和 Runnable 来模拟这些,但 SwingWorker 已经为您完成了。
SwingWorker
封装了与事件调度线程的正确交互。Runnable
没有。