Ago*_*noX 19 java swing swingworker cancellation
Javadoc的done()
方法SwingWorker:
在doInBackground方法完成后在Event Dispatch Thread上执行.
我已经找到了在取消工人的情况下不是这样的线索.
Done
在每种情况下都会被调用(正常终止或取消),但是当cancelled
它没有排入 EDT时,就像正常终止时那样.
done
在SwingWorker
取消a的情况下调用时是否有一些更精确的分析?
澄清:这个问题不是关于如何做到cancel
的SwingWorker
.这里假设SwingWorker
以正确的方式取消.
而且当它们应该完成时,它不是关于线程仍在工作.
Ago*_*noX 19
通过线程取消线程时
myWorkerThread.cancel(true/false);
Run Code Online (Sandbox Code Playgroud)
完成方法(非常令人惊讶地)由cancel方法本身调用.
您可能会发生什么,但实际上不会:
- 您调用取消(使用mayInterrupt或不使用)
- 取消设置线程取消
- doInBackground退出
- 完成被称为*
(*已完成排队到EDT ,这意味着,如果EDT很忙,它会在EDT完成之后发生.
实际上会发生什么:
- 你调用cancel(无论是否使用mayInter)
- 取消设置线程取消
- 完成作为取消代码*的一部分调用
- doInBackground将在它完成循环时退出
(*完成没有加入EDT,但是调用了取消调用,因此它对EDT产生了非常直接的影响,通常是GUI)
我提供了一个证明这一点的简单例子.
复制,粘贴和运行.
1.我在done中生成了一个运行时异常.堆栈线程显示由cancel调用done.
2.在取消后大约4秒后,你将从doInBackground中收到一个问候语,这可以证明在线程退出之前调用了done.
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!");}
}
}
Run Code Online (Sandbox Code Playgroud)
done()
在任何情况下都被调用,工人被取消或正常完成.然而,有些情况doInBackground
仍然在运行并且done
已经调用了该方法(cancel()
无论线程是否已经完成,这都在内部完成).这里有一个简单的例子:
public static void main(String[] args) throws AWTException {
SwingWorker<Void, Void> sw = new SwingWorker<Void, Void>() {
protected Void doInBackground() throws Exception {
System.out.println("start");
Thread.sleep(2000);
System.out.println("end");
return null;
}
protected void done() {
System.out.println("done " + isCancelled());
}
};
sw.execute();
try {
Thread.sleep(1000);
sw.cancel(false);
Thread.sleep(10000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
因此,可以done
是在doInBackground
完成之前调用的情况.
归档时间: |
|
查看次数: |
15378 次 |
最近记录: |