为什么选择 SwingWorker?为什么不只是 Thread 或 Runnable?

2022-09-02 23:13:10

使用代替 或 的优点是什么?SwingWorkerThreadRunnable


答案 1

我认为SwingWorker的文档非常好:

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

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

  • 不应在事件调度线程上运行耗时的任务。否则,应用程序将无响应。
  • 只能在事件调度线程上访问 Swing 组件。

这些约束意味着具有时间密集型计算的 GUI 应用程序至少需要两个线程:1) 一个线程来执行冗长的任务,2) 事件调度线程 (EDT) 用于所有与 GUI 相关的活动。这涉及线程间通信,实现起来可能很棘手。

SwingWorker 专为以下情况而设计:您需要在后台线程中运行长时间运行的任务,并在完成后或在处理时向 UI 提供更新。SwingWorker 的子类必须实现 doInBackground() 方法来执行后台计算。

当然,您可以使用Thread,Runtime和SwingUtilities()来执行此操作,但是使用SwingWorker类更容易,并且可能更不容易出错。invokeLater


答案 2

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

新的并发类提炼了从那时起所学到的关于多线程的所有知识(谢谢你,Doug Lea和其他人)。编写多线程代码非常困难。新的并发类(包括 SwingWorker)试图使这更容易。

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

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


推荐