# 工作者线程和 SwingWorker

> 原文： [https://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html](https://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html)

当 Swing 程序需要执行长时间运行的任务时，它通常使用 _ 工作线程 _ 之一，也称为 _ 后台线程 _。在工作线程上运行的每个任务都由 [`javax.swing.SwingWorker`](https://docs.oracle.com/javase/8/docs/api/javax/swing/SwingWorker.html) 的实例表示。 `SwingWorker`本身就是一个抽象类;你必须定义一个子类才能创建一个`SwingWorker`对象;匿名内部类通常用于创建非常简单的`SwingWorker`对象。

`SwingWorker`提供了许多通信和控制功能：

*   `SwingWorker`子类可以定义一个方法`done`，该方法在后台任务完成时在事件派发线程上自动调用。
*   `SwingWorker`实现 [`java.util.concurrent.Future`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html) 。此接口允许后台任务为其他线程提供返回值。此界面中的其他方法允许取消后台任务并发现后台任务是否已完成或已取消。
*   后台任务可以通过调用`SwingWorker.publish`来提供中间结果，从而使事件调度线程调用`SwingWorker.process`。
*   后台任务可以定义绑定属性。对这些属性的更改会触发事件，从而导致在事件派发线程上调用事件处理方法。

以下小节将讨论这些功能。

* * *

**Note:** 

`javax.swing.SwingWorker`类已添加到 Java SE 6 中的 Java 平台中。在此之前，另一个类（也称为`SwingWorker`）被广泛用于某些相同的目的。旧的`SwingWorker`不是 Java 平台规范的一部分，并未作为 JDK 的一部分提供。

新的`javax.swing.SwingWorker`是一个全新的类。它的功能不是旧`SwingWorker`的严格超集。具有相同功能的两个类中的方法不具有相同的名称。此外，旧`SwingWorker`类的实例是可重用的，而每个新的后台任务需要`javax.swing.SwingWorker`的新实例。

在整个 Java 教程中，`SwingWorker`的任何提及现在都指`javax.swing.SwingWorker`。

* * *