myWorkerThread.cancel(true/false);
done方法(非常令人惊讶)由cancel方法本身调用。
您可能会期望发生的事情,但实际上并不会:
-调用cancel(无论是否使用mayInterrupt)
-取消设置线程取消
-doInBackground退出
-完成被称为
(完成被 排队 到EDT中,这意味着,如果EDT忙,则在EDT完成其 *** 作后发生)
实际发生的情况:
-调用cancel(无论是否与mayInterrupt一起使用)
-取消设置线程取消
-将done作为取消代码的一部分 *
-doInBackground将在其循环完成后退出
(完成没有加入到EDT中,而是调用了cancel调用,因此它对EDT具有非常直接的影响,通常是GUI)
我提供了一个简单的例子来证明这一点。
复制,粘贴并运行。
1.我在完成时生成一个运行时异常。堆栈线程显示完成由取消调用。
2.大约在取消后4秒钟后,您将从doInBackground收到问候语,该问候语证明在线程退出之前完成了调用。
import java.awt.EventQueue;import javax.swing.SwingWorker;public class SwingWorker05 {public static void main(String [] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { W w = new W(); w.execute(); Thread.sleep(1000); try{w.cancel(false);}catch (RuntimeException rte) { rte.printStackTrace(); } Thread.sleep(6000); } catch (InterruptedException ignored_in_testing) {} } });}public static class W extends SwingWorker <Void, Void> { @Override protected Void doInBackground() throws Exception { while (!isCancelled()) { Thread.sleep(5000); } System.out.println("I'm still alive"); return null; } @Override protected void done() {throw new RuntimeException("I want to produce a stack trace!");}}}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)