我有一個多線程的實現,我創建一個ExecutorService並提交要執行的任務,我想知道什麼時候所有線程都已完成而沒有阻塞主線程和UI。我試過ExecutorService.awaitTermination()
,但它阻止了主線程和用戶界面。我搜索了很多,但我似乎無法找到一個這樣做的優雅方式。我目前正在考慮創建另一個線程來計算完成的線程數量,並在完成時啓動一個事件,但這不是一個好方法,而且我想要一個更好的解決方案!ExecutorService,如何知道所有線程何時完成而不阻塞主線程?
回答
isTerminated()
會做
不過請注意,這兩個awaitTermination
和isTerminated
只會給你一個有意義的結果,你都呼籲shutdown
我發現了一些關於isTerminated()的內容,但仍然認爲我需要在「side thread」上運行它來經常檢查它是否返回true,從而將我帶入我的初始解決方案! – Trota 2012-03-20 00:15:11
使用SwingWorker
來關閉線程池,並調用awaitTermination()
後。這將防止UI阻塞,並從SwingWorker實現上的Event Dispatch Thread中調用done()
,您可以使用它來觸發您所需的任何UI更改。
如果您希望跟蹤通過UI更新運行的線程,則可以使用工作線程在一個循環中監控此線程,並調用publish()
,然後將參數傳遞給EDT上的process()
實現。
您可以維護一個單獨的線程在執行服務實例關閉追蹤:
final ExecutorService execSvc = ...;
execSvc.submit(task1);
...
execSvc.submit(taskN);
// important to request the exec service to shut down :)
execSvc.shutdown();
new Thread(new Runnable() {
public void run() {
while (!execSvc.isTerminated()) {
try {
execSvc.awaitTermination(60, TimeUnit.SECONDS);
} catch (InterruptedException e) {
// ignore exception
}
}
System.out.println("ExecSvc.run: exec service has terminated!");
// possibly submit a task using SwingUtilities.invokeLater() to update the UI
}
}).start();
CountDownLatch latch = new CountDownLatch(totalNumberOfTasks); ExecutorService taskExecutor = Executors.newFixedThreadPool(4); while(...) { taskExecutor.execute(new MyTask()); } try { latch.await(); } catch (InterruptedException E) { // handle }
,你的任務中
(在嘗試/最後附上)latch.countDown();
或者在您調用shutdown()的ExecutorService上,然後在awa itTermination()
ExecutorService taskExecutor = Executors.newFixedThreadPool(4); while(...) { taskExecutor.execute(new MyTask()); } taskExecutor.shutdown(); try { taskExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); } catch (InterruptedException e) { ... }
也看看THIS答案
除非我誤解了我的理解,否則這兩種解決方案都不能解決OP的基本問題,即避免主要阻塞線。 – Trevor 2014-06-22 12:41:14
- 1. 如何知道ExecutorService中的所有線程何時完成?
- 2. c# - 線程池完成時通知,不阻塞主線程
- 3. ExecutorService超時而不會阻塞主線程
- 4. 等到子線程完成但不阻塞主線程
- 5. 等待線程完成而不阻塞UI線程
- 6. Smartthreadpool如何知道所有線程何時完成?
- 7. 線程完成時通知主線程
- 8. 知道線程何時完成
- 9. 如何阻止主線程,直到所有其他線程完成執行?
- 10. 如何啓動不阻塞Java主線程的後臺線程?
- 11. 知道所有線程何時完成並處理異常
- 12. 阻塞線程上是否存在ExecutorService?
- 13. 如何知道線程已完成
- 14. 如何阻塞和通知線程
- 15. 如何讓主線程等待所有子線程完成?
- 16. 如何知道所有線程池的線程是否已完成其任務?
- 17. .NET - 阻塞主線程,直到有任何可用線程
- 18. Nacl_IO阻塞線程,直到fopen完成
- 19. 做的ExecutorService和CountDownLatch阻止主線程,直到他們完成?
- 20. 隊列阻塞主線程
- 21. MaxDegreeOfParallelism阻塞主線程?
- 22. NSTask阻塞主線程
- 23. NSoperationQueue阻塞主線程
- 24. 如何生成表單並且不阻塞主線程?
- 25. 如何知道java方法阻塞當前線程
- 26. 當主線程被阻塞時,UIActivityIndicatorView如何不停止?
- 27. 斯卡拉 - 多線程,當任何子線程完成時完成主線程
- 28. 更新GMSMarkers沒有阻塞主線程
- 29. 如何知道線程中的工作何時完成?
- 30. 我如何知道多線程何時完成(Swift)
你的主線程做的,它不能被阻止什麼? – EJP 2012-03-20 00:42:58
你使用什麼UI工具包? – Dev 2012-03-20 00:44:12