当前位置: 首页 > 面试题库 >

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

凌照
2023-03-14
问题内容

Javadoc的done()方法SwingWorker:

doInBackground方法完成后,在事件调度线程上执行。

我已经暗示,对于被取消的工人,情况并非如此。
Done在每种情况下都会被调用(正常终止或取消),但是当cancelled未排入 EDT时(通常终止会发生这种情况)。

doneSwingWorker取消a的情况下,何时调用有更精确的分析吗?

澄清:这个问题是 不是 就如何cancel一个SwingWorker。在此假定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!");}

}

}


 类似资料:
  • 问题内容: 我是一名即将毕业的计算机科学专业的学生,​​在我的整个编码生涯中,我发现很少使用枚举的实例,除了典型的情况(例如代表标准纸牌的面孔)外,还使用了枚举。 您是否知道在日常编码中使用枚举的任何巧妙方法? 为什么枚举如此重要,在什么情况下应该能够确定建立枚举是最佳方法? 问题答案: 这些是主要的论点,以及短的例子。 的情况 从Java 6开始,是一个凌乱类的示例,该类可以从使用中受益匪浅(除

  • 问题内容: 我正在尝试通过对象读取命令。为了检查输入语法,我使用了(对于缺少命令的情况)。在许多情况下,它确实可以正常工作,但是现在我有了JavaAPI中描述为“ MAY块并等待输入”的情况。 该方法什么时候阻止,我该如何控制?有趣的是,在块之前有3个案例,它工作得很好。另外,JavaAPI还描述了检查是否存在另一个Input的正确方法,以使该Method 不会产生。 这是我到目前为止所产生的代码

  • 我正在尝试通过对象读取命令。为了检查输入语法,我使用<code>sc。hasNext()(对于缺少命令的情况)。它已经在很多情况下运行良好,但现在我看到了JavaAPI中描述的“MAY block and wait for Input”的情况。 方法何时阻塞,我如何控制它?有趣的是,在街区前的3个案例中,它工作得非常好。此外,JavaAPI还将描述为检查是否存在另一个Input的正确方法,从而使方

  • 问题内容: 我遇到这种情况,我需要将a解析为an ,但我不知道该如何处理。当我没有抓住它时,编译器不会抱怨,但是我只是想确保自己能够正确处理这种情况。 我只想这样简化我的代码。编译器没有问题,但是线程在上死掉了。 Google CodePro希望我以某种方式记录该异常,并且我同意这是最佳实践。 我希望当当前片段不是数字或无法解析时返回此方法。当我没有显式捕获时,是否不分配变量?还是有一些默认值返回

  • 本文向大家介绍什么时候用delegate,什么时候用Notification?相关面试题,主要包含被问及什么时候用delegate,什么时候用Notification?时的应答技巧和注意事项,需要的朋友参考一下 答:delegate针对one-to-one关系,并且reciever可以返回值 给sender,notification 可以针对one-to-one/many/none,recieve

  • 问题内容: 奇怪的是: 似乎或多或少被定义为。通过这种方式很容易产生错误: 一些fname意外地以else块结尾。修复很简单,我们应该改用它,但是从表面上看,这似乎是一种不错的pythonic方式,并且比“正确”的方式更具可读性。 由于字符串是不可变的,所以为什么字符串错误是什么技术细节?什么时候进行身份检查更好,什么时候进行平等检查更好? 问题答案: 据我所知,检查对象身份是否相等。由于没有强制