【发布时间】:2014-12-05 05:56:40
【问题描述】:
如果能帮助您理解这一点,我们将不胜感激。我的理解是取消 SwingWorker 线程是合作的。然而,这不是我所看到的。
下面的代码将停止 SwingWorker 线程,即使我没有可中断的操作。我不希望它以这种方式工作。请注意,我在 doStuff() 中专门放置了一个无限循环。当我在 main() 例程中取消时:
worker.cancel(true),
我在 done() 函数中结束,表明 doInBackground() 已退出(特别是在异常处理程序中)。即使没有可中断的操作,看起来线程也被杀死了。请注意,如果我更改为 worker.cancel(false),我会得到相同的效果。
class AWorker extends SwingWorker<String, Object> {
void doStuff() {
System.out.println("Entered doStuff");
while (true);
}
@Override
public String doInBackground() {
//System.out.println("doInBackground started");
doStuff();
return "hello";
}
@Override
protected void done() {
try {
System.out.println("done() entered");
String status = get();
System.out.println("done(): get = " + status);
} catch (Exception e) {
System.out.println("done(): Exception: " + e);
}
}
public static void main(String[] args) throws Exception {
AWorker worker = new AWorker();
worker.execute();
Thread.sleep(5000);
worker.cancel(true);
}
}
我应该补充一点,我可以完全按照 Java 文档中的描述来完成这项工作,方法是协同进入在我取消或轮询 isCancelled() 时被中断的睡眠。只是想知道为什么它会像我在上面的代码 sn-p 中那样做。如果我冒险猜测一下,看起来当我调用 worker.cancel() 时没有刚才描述的协作机制,那么 done() 函数会立即被调用。
【问题讨论】:
标签: java multithreading swingworker