前言
在桌面应用程序开发的过程中难免会去使用数据,那么这些数据来自哪里呢,数据库、服务器、网络、本地文件等到。这些操作我们统一称作费时操作。若是使用同步开发的话,桌面应用程序UI则会等待这些费时操作完成之后才会更新UI,而使用异步的话,则不会影响,我更新我的UI,你获取做完这些费时操作再通知我,把数据传给我就好了。所以在JDK1.6时候推出了——SwingWorker
1 | javax.swing |
使用Swing编写多线程应用程序时,需要记住两个约束:
- 不应在Event DispatchThread上运行耗时的任务。否则应用程序将无响应。
- 应仅在Event Dispatch Thread上访问Swing组件。
这些约束意味着具有时间密集型计算的GUI应用程序需要至少两个线程:1)执行冗长任务的线程和2)所有GUI相关活动的事件调度线程(EDT)。这涉及线程间通信,这可能很难实现。
SwingWorker适用于需要在后台线程中运行长时间运行任务并在完成或处理时为UI提供更新的情况。子类SwingWorker必须实现该doInBackground()方法来执行后台计算。
工作流程
当前线程:execute()在此线程上调用该方法。它计划SwingWorker在工作 线程上执行 并立即返回。可以等待SwingWorker完成使用get方法。*get() 方法最好在done()方法中调用,这样才能保证操作是完成的 *
工作线程:doInBackground() 在此线程上调用该方法。这是所有背景活动应该发生的地方。要通知 PropertyChangeListeners绑定属性更改,请使用 firePropertyChange和 getPropertyChangeSupport()方法。默认情况下,有两个绑定属性可用:state和progress。
事件调度线程:此线程上发生所有与Swing相关的活动。SwingWorker调用 process和done()方法并PropertyChangeListeners在此线程上通知任何方法。
SwingWorker仅设计为执行一次。执行 SwingWorker多次不会导致doInBackground两次调用该 方法。
官方实例
1 | class PrimeNumbersTask extends |
日常使用
1 | class ProgressWorker extends SwingWorker<List<Data>, Void> { |