取消后台任务
要取消正在运行的后台任务,请调用SwingWorker.cancel任务必须配合其自己的取消操作。有两种方法可以做到这一点:
-
在收到中断时终止。 Interrupts在Concurrency中描述了此过程。
-
通过短时间调用SwingWorker.isCancelled。如果已为此
SwingWorker
调用cancel
,则此方法返回true
。
cancel
方法采用一个boolean
参数。如果参数为true
,则cancel
向后台任务发送中断。无论参数是true
还是false
,调用cancel
都会将对象的取消状态更改为true
。这是isCancelled
返回的值。更改后,取消状态将无法恢复。
上一节中的Flipper
示例使用仅状态习语。 isCancelled
返回true
时,退出doInBackground
中的主循环。当用户单击“取消”按钮,触发使用false
参数调用cancel
的代码时,就会发生这种情况。
仅状态方法对Flipper
有意义,因为Flipper
的实现不包含任何可能抛出InterruptedException
的代码。为了响应中断,后台任务将不得不在短间隔内调用Thread.isInterrupted
。将SwingWorker.isCancelled
用于相同的 Object 同样容易
Note:
如果取消了SwingWorker
对象的后台任务后对其调用get
,则抛出java.util.concurrent.CancellationException。