为什么使用SwingWorker?为什么不只是线程或可运行?

问题描述:

使用SwingWorker而不是ThreadRunnable有什么好处?为什么使用SwingWorker?为什么不只是线程或可运行?

线程和Runnable是Java 1.0的一部分;他们和当时一样好。

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

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

可以用Thread和Runnable模仿这些,但SwingWorker已经为你做了。

+1

SwingWorker真的是新并发类的一部分吗?我认为它是Swing API的一部分,使用它的主要原因是因为有关事件调度​​线程(EDT)的限制。 – 2010-12-23 12:44:10

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没有。