为什么使用SwingWorker?为什么不只是线程或可运行?
答
线程和Runnable是Java 1.0的一部分;他们和当时一样好。
自那时起,新的并发类提取了所有关于多线程的知识(谢谢Doug Lea等人)。编写多线程代码非常困难。新的并发类,包括SwingWorker,试图让这更容易。
首先注意泛型为强类型。内置了一个机制来发布和处理最终和中间结果。
可以用Thread和Runnable模仿这些,但SwingWorker已经为你做了。
答
SwingWorker负责处理一些细节,例如运行任务时的UI更新或任务完成后。这些必须在Swing EDT线程上执行。你可以自己做,但是做错了很容易。
答
我觉得SwingWorker的文档是相当不错的:
的抽象类在专用 线程中执行冗长 GUI的交互任务。
在编写多线程使用的Swing 应用,有两个 约束要记住:(参见 How to Use Threads有详细介绍):
- 耗时的任务,不应该运行事件调度线程。 否则应用程序变为 无响应。
- 只能在事件调度线程 上访问Swing组件。
这些限制意味着一个GUI 应用随时间密集 计算需要至少两个线程: 1)一个线程来执行冗长 任务和2)在事件指派线程 (EDT)对于所有的GUI相关的活动。 这涉及到线程间 通信,这可能会很棘手的到 实现。
的SwingWorker被设计用于需要有一个长期运行的 任务运行在后台线程和 提供更新的用户界面既可以当 完成,或在处理情况 。 SwingWorker的子类 必须实现 doInBackground()方法来执行 后台计算。
你一定可以做到这一点使用线程,运行和SwingUtilities类(invokeLater
),但它更容易和使用SwingWorker类可能不太容易出错。
答
SwingWorker
封装与事件派发线程的正确交互。 Runnable
没有。
SwingWorker真的是新并发类的一部分吗?我认为它是Swing API的一部分,使用它的主要原因是因为有关事件调度线程(EDT)的限制。 – 2010-12-23 12:44:10