使用SwingWorker
代替Thread
或Runnable
有什么好处?
答案 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
没有。