栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/496067.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号