因此,如果get方法導致在done方法內等待,事實上它會阻塞Event Dispatch Thread,因爲done方法在EDT上執行。
實際上,如果做被調用時,doInBackground
已經返回,因此調用get
內done
不會阻止事件調度線程。
也是一樣,如果你使用的是PropertyChangeListener
支持和監控狀態DONE
更新
這樣的變化,在看看SwingWorker calls 'done' before the 'doInBackground' is finished後,這將意味着調用一個get
取消的工作人員會不定期地阻止EDT,基本的工作實際上是通過檢查SwingWorker#isCancelled
狀態來忽略返回結果。讓我們面對它,如果工人被取消,返回結果是未知/未定義的,所以最好不要嘗試和get
它。
作爲一個例子(基於從錯誤的代碼)
import java.util.concurrent.ExecutionException;
import javax.swing.SwingWorker;
public class Main {
public static void main(String[] args) throws InterruptedException {
SwingWorker<String, String> worker = new SwingWorker<String, String>() {
@Override
protected String doInBackground() throws Exception {
try {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("Working...");
Thread.sleep(1000);
}
} catch (InterruptedException ex) {
System.out.println("Got interrupted!");
}
try {
System.out.println("Cleaning up");
Thread.sleep(10000);
System.out.println("Done cleaning");
} catch (InterruptedException ex) {
System.out.println("Got interrupted second time!");
}
return null;
}
@Override
protected void done() {
System.out.println("Done");
if (!isCancelled()) {
long start = System.currentTimeMillis();
try {
get();
} catch (InterruptedException | ExecutionException ex) {
ex.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println("Took " + ((end - start)/1000d));
} else {
System.out.println("Was cancelled");
}
}
};
worker.execute();
Thread.sleep(10000);
worker.cancel(true);
Thread.sleep(20000);
}
}
檢查一個相關的問題[這裏](http://stackoverflow.com/q/7053865/230513)。 – trashgod
如果使用'cancel',這可能不成立。 (bug)https://bugs.openjdk.java.net/browse/JDK-8081474 – Radiodef
@radiodef理論上,如果取消,得到「應該」拋出一個InterruptedException。我有興趣瞭解ifnthis只是java 8中的一個bug,或者不是 – MadProgrammer