SwingWorker:什么时候确切称为完工方法?

SwingWorker:什么时候确切称为完工方法?,第1张

SwingWorker:什么时候确切称为完工方法?

通过取消线程

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!");}}}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5488188.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存