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

Java 为什么是SwingWorker?为什么不只是线程或可运行?,java,swingworker,Java,Swingworker,使用SwingWorker而不是Thread或Runnable有什么好处?SwingWorker会在运行任务时或任务完成后处理一些细节,如UI更新。这些必须在Swing EDT线程上执行。你可以自己做,但做错事太容易了。线程和Runnable是Java1.0的一部分;他们和当时一样好 新的并发类提取了自那时以来关于多线程的所有知识(谢谢Doug Lea和其他人)。编写多线程代码非常困难。新的并发类,包括SwingWorker,试图让这变得更容易 首先注意强类型的泛型。内置了一种机制来发布和处理最

使用
SwingWorker
而不是
Thread
Runnable
有什么好处?

SwingWorker会在运行任务时或任务完成后处理一些细节,如UI更新。这些必须在Swing EDT线程上执行。你可以自己做,但做错事太容易了。

线程和Runnable是Java1.0的一部分;他们和当时一样好

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

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


可以用Thread和Runnable来模拟这些,但SwingWorker已经为您完成了。

我认为的文档非常好:

一个抽象类,用于执行冗长的 GUI在专用环境中交互任务 线

在编写多线程 使用Swing的应用程序有两种 要记住的约束条件:(参考 如需了解更多详细信息):

  • 不应在事件分派线程上运行耗时的任务。 否则,应用程序将变为 反应迟钝
  • 应在事件分派线程上访问Swing组件 只是
这些约束意味着GUI 时间密集型应用程序 计算至少需要两个线程: 1) 一个线程来执行长时间的 任务和2)事件调度线程 (EDT)用于所有GUI相关活动。 这涉及到线程间 沟通是很难做到的 实施

SwingWorker专为各种情况而设计 你需要进行长距离跑步的地方 任务在后台线程中运行,并且 在以下情况下提供对UI的更新: 已完成,或正在处理。子类 SwingWorker必须执行 doInBackground()方法来执行 背景计算


当然,您可以使用线程、运行时和SwingUtilities(
invokeLater
)来实现这一点,但是使用SwingWorker类更容易,而且可能更不容易出错。

SwingWorker
封装了与事件调度线程的正确交互<代码>可运行的没有。

SwingWorker真的是新并发类的一部分吗?我认为这是Swing API的一部分,使用它的主要原因是因为事件调度线程(EDT)的约束,而不是并发包的一部分,但我会以同样的精神考虑它。可能是错的。