在专用线程中执行长时间 GUI 交互任务的抽象类。
使用 Swing 编写多线程应用程序时,要记住两个约束条件:
1、不应该在事件指派线程 上运行耗时任务。否则应用程序将无响应。
2、只能在事件指派线程 上访问 Swing 组件。
这些约束意味着需要时间密集计算操作的 GUI 应用程序至少需要以下两个线程:1) 执行长时间任务的线程; 2) 所有 GUI 相关活动的事件指派线程 (EDT)这涉及到难以实现的线程间通信。
SwingWorker
设计用于需要在后台线程中运行长时间运行任务的情况,并可在完成后或者在处理过程中向 UI 提供更新。SwingWorker
的子类必须实现 doInBackground()
方法,以执行后台计算。
工作流
SwingWorker
的生命周期中包含三个线程:
-
当前 线程:在此线程上调用
execute()
方法。它调度SwingWorker
以在 worker 线程上执行并立即返回。可以使用get
方法等待SwingWorker
完成。 -
Worker 线程:在此线程上调用
doInBackground()
方法。所有后台活动都应该在此线程上发生。要通知PropertyChangeListeners
有关绑定 (bound) 属性的更改,请使用firePropertyChange
和getPropertyChangeSupport()
方法。默认情况下,有两个可用的绑定属性:state
和progress
。 -
事件指派线程:所有与 Swing 有关的活动都在此线程上发生。
SwingWorker
调用process
和done()
方法,并通知此线程的所有PropertyChangeListener
。
通常,当前 线程就是事件指派线程。
在 worker 线程上调用 doInBackground
方法之前,SwingWorker
通知所有 PropertyChangeListener
有关对 StateValue.STARTED
的 state
属性更改。doInBackground
方法完成后,执行 done
方法。然后 SwingWorker
通知所有 PropertyChangeListener
有关对 StateValue.DONE
的 state
属性更改。
SwingWorker
被设计为只执行一次。多次执行 SwingWorker
将不会调用两次 doInBackground
方法。
按照上面的书法,扩展类调用execute()
方法,应该是启动一个新的线程用的,然后在转到doInBackground()
方法去执行你那个比较耗时的操作,紧接着,做完了之后,在去做process
或 done()
方法,注意,process一般来处理像不停输出中间结果的问题较有用,done就是你做完了之后更新UI即可,你要混着用,也没事。另外还有一点就是,他里面有个属性 private volatile int progress; ,这个属性它可以被绑定一个相应事件上,如下:
public final void addPropertyChangeListener(PropertyChangeListener listener) {
getPropertyChangeSupport().addPropertyChangeListener(listener);
}