希望在理解这一点方面有所帮助。我的理解是取消SwingWorker线程是合作的。但是,这不是我所看到的。Java SwingWorker取消合作?
我下面的代码将停止SwingWorker线程,即使我没有可中断的操作。我不希望它以这种方式工作。对于测试我注意到在doStuff()中专门设置了一个无限循环。当我做了消除在main()函数:
worker.cancel(真),
我在做()函数最终表明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);
}
}
我要补充一点,我可以使这项工作完全一样时,我取消被中断睡眠或通过轮询isCancelled共同把()在Java文档中描述。只是想知道为什么它会在我上面的代码片段中做到这一点。如果我冒险猜测,看起来像当我调用worker.cancel()而没有刚描述的协作机制时,那么done()函数会立即被调用。
非常有启发性的分析表明doInBackground在SwingWorker被取消后仍然实际执行。 如果更新Java文档以更准确地反映发生的情况,那将会很棒。我试图提交错误报告,但Oracle提交错误报告的过程非常可怕。 – lucyimhome 2014-12-16 03:32:23