工作者线程和 SwingWorker

原文: https://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html

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

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

  • SwingWorker子类可以定义一个方法done,该方法在后台任务完成时在事件派发线程上自动调用。
  • SwingWorker实现 java.util.concurrent.Future 。此接口允许后台任务为其他线程提供返回值。此接口中的其他方法允许取消后台任务并发现后台任务是否已完成或已取消。
  • 后台任务可以通过调用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