为什么要使用SwingWorker?为什么不能只用Thread或者Runnable?

17
使用SwingWorker相对于使用ThreadRunnable的优势是什么?
4个回答

17

我认为SwingWorker的文档相当不错:

这是一个抽象类,用于在专用线程中执行需要与GUI交互的长时间任务。

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

  • 耗时任务不应在事件分派线程上运行。否则,应用程序会变得无响应。
  • 只能在事件分派线程上访问Swing组件。

这些限制意味着具有耗时计算需求的GUI应用程序至少需要两个线程:1)一个线程用于执行长时间任务;2)事件分派线程(EDT)用于所有与GUI相关的活动。这涉及到跨线程通信,可能难以实现。

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

当然,您可以使用Thread、Runtime和SwingUtilities(invokeLater)来完成此操作,但使用SwingWorker类可能更容易,而且可能出错的概率较小。


13

SwingWorker负责一些细节,例如在运行任务时更新UI或者任务完成后的操作。这些细节必须在Swing EDT线程上执行。您可以自己执行,但很容易出错。


13

Thread 和 Runnable 是 Java 1.0 的一部分;它们现在仍然和当时一样好。

新的并发类集成了自那以后关于多线程所学到的所有内容(感谢 Doug Lea 和其他人)。编写多线程代码非常困难。包括 SwingWorker 在内的新的并发类试图使这变得更加容易。

首先要注意泛型进行强类型检查。其中内置了机制用于发布和处理最终结果和中间结果。

使用 Thread 和 Runnable 可以模仿这些机制,但是 SwingWorker 已经为您做好了。


1
SwingWorker真的是新并发类的一部分吗?我认为它是Swing API的一部分,并且使用它的主要原因是因为事件调度线程(EDT)的限制。 - user85421
1
不属于并发包,但我认为它具有相同的精神。可能是错误的。 - duffymo

6

SwingWorker 封装了与事件分派线程的正确交互,而 Runnable 则没有。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接