我有一些代碼在單獨的線程中執行下載,創建的目的是爲了讓JFrame GUI在下載過程中繼續更新。但是,當我使用Thread.join()時,目的完全失敗,因爲它導致GUI停止更新。我需要一種方法來等待線程完成並仍然更新GUI。等待Java中的線程完成
1
A
回答
4
您可以讓下載的任務也將事件發送到GUI。
例如:
Runnable task = new Runnable() {
public void run() {
// do your download
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// call some method to tell the GUI that the download finished.
}
});
}
};
,然後運行它,要麼使用一個Executor(優選方法)或原紗:
executor.execute(task);
或
new Thread(task).start();
正如在comme中指出的那樣nts,您通常會使用SwingWorker來做這種事情,但您也可以使用上述的手動方法。
的SwingWorker提供了一個doInBackground
方法,你要堅持你的下載邏輯,一個done
方法,你會堅持代碼來通知下載完成的GUI和get
方法得到的doInBackground
結果(如果有一個)。
例如,
class Downloader extends SwingWorker<Object, Object> {
@Override
public Object doInBackground() {
return doDownload();
}
@Override
protected void done() {
try {
frame.downloadDone(get());
} catch (Exception ignore) {
}
}
}
(new Downloader()).execute();
相關問題
- 1. Java等待線程完成
- 2. Java多線程等待線程完成
- 3. 等待UI線程完成
- 4. 等待線程完成python
- 5. 使主程序等待線程完成
- 6. 若要完成線程的等待(Android)
- 7. 如何等待一組線程'真的'在java中完成?
- 8. 等待完成Java的過程
- 9. java:爲什麼主線等待子線程完成
- 10. 等待線程完成執行上
- 11. 等待,直到線程完成擺好
- 12. 如何等待所有線程完成
- 13. 異步等待一個線程完成
- 14. 等待線程循環完成
- 15. 讓Android MainActivity等待線程完成
- 16. C#等待所有線程完成Main()
- 17. SDL和C++:等待多線程完成
- 18. 試圖等待所有線程完成
- 19. 等待線程池完成執行
- 20. 等待線程完成執行
- 21. C#等待多個線程完成
- 22. 如何等待一個線程完成
- 23. C++等待所有線程完成
- 24. 如何等待所有線程完成?
- 25. ManualResetEvent不等待線程池完成
- 26. 新線程永不完成等待WebBrowser
- 27. AJAX線程 - 如何等待它完成?
- 28. 等待一個線程在java中完成
- 29. Java等待runnable完成
- 30. Java等待JFrame完成
檢查[SwingWorker類](http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html) – m0skit0