我知道shutdown()
和awaitTermination()
存在。問題在於池中的runnables需要能夠向其添加一個未知數(不能使用倒數計時器)的其他runnables,如果我調用shutdown()
,這些任務將被拒絕。我如何知道他們何時完成?如何知道ExecutorService中的所有線程何時完成?
回答
而不是提交Runnable
任務到Executor
,而應該使用ForkJoinTask
/ForkJoinPool
來代替。 A ForkJoinTask
在ForkJoinPool
內運行,可以產生任意數量的(子)任務並等待它們完成,而不會實際阻塞當前線程。 A ForkJoinTask
在其所有子任務完成時完成,因此當初始(根)ForkJoinTask
完成時,完成整個計算。
查看Oracle - The Java™ Tutorials - Fork/Join瞭解詳情。由於你所有的任務都是沒有結果的(Runnable
),你應該繼承RecursiveAction
(它本身就是ForkJoinTask
的一個子類)。執行方法compute()
,並通過調用invoke(subtask)
,invokeAll(subtask1, subtask2, ...)
或subtask.fork()
,然後subtask.join()
產生任意數量的新任務。
整個計算是爲執行如下:
MyRecursiveAction task = new MyRecursiveAction(params);
ForkJoinPool pool = new ForkJoinPool(numberOfThreads);
pool.invoke(task); // will block until task is done
Unfortunatley的優點叉/加入有一定的侷限性,例如:
(...)計算中應理想地避免同步方法或除了加入 其他任務或使用同步器(例如發佈 的相位器)以與叉/加入調度協作之外,其他阻塞同步應最小化。可細分的任務 也不會執行阻塞I/O,理想情況下應該訪問完全獨立於其他正在運行的任務訪問的變量。通過不允許檢查異常 (例如拋出IOException)來寬鬆地執行這些指導原則。 (...)
欲瞭解更多詳情,請參閱API docs of ForkJoinTask
。
這種方式在答案中發揮最大作用。謝謝。 – user2980766 2015-04-07 21:10:20
使用Future
而不是Runnable
。有這個Future#isDone
方法可以幫助你。
如果您沒有任何有意義的內容從Callable
返回,請使用Callable<Void>
和Future<Void>
。
如果您能夠使用Guava Futures,您可以使用Futures.allAsList
或Futures.successfulAsList
。這使您可以將從ExecutorService
收到的Future
個實例包裝爲一個Future
,然後您可以使用isDone()
(或者只是get()
,如果要阻止直到完成)。
- 1. ExecutorService,如何知道所有線程何時完成而不阻塞主線程?
- 2. Smartthreadpool如何知道所有線程何時完成?
- 3. 知道所有線程何時完成並處理異常
- 4. 知道線程何時完成
- 5. 如何知道線程中的工作何時完成?
- 6. 如何知道其他線程中的任務何時完成?
- 7. 如何知道線程已完成
- 8. 如何知道所有線程池的線程是否已完成其任務?
- 9. GPars如何知道拋出異常時所有線程都已完成?
- 10. 我如何知道多線程何時完成(Swift)
- 11. 我如何知道所有訂閱者何時完成?
- 12. 如何知道所有ajax調用何時完成
- 13. 如何知道反應器的所有過程都已完成
- 14. 瞭解ExecutorService何時完成
- 15. Multithread如何知道什麼時候所有任務完成(Python)
- 16. 我如何知道ThreadPoolExecutor中的線程已完成?
- 17. 如何等待所有線程完成
- 18. 如何等待所有線程完成?
- 19. 如何知道FileSystemWatcher何時完成
- 20. 如何知道dllmain何時完成?
- 21. 如何知道Core Animation何時完成?
- 22. 如何知道何時下載完成
- 23. 如何知道ScheduledExecutorService何時完成
- 24. 如何知道何時下載完成?
- 25. 如何知道FileSystem.CopyDirectory何時完成?
- 26. 我如何知道location.reload()何時完成?
- 27. 如何知道dd何時完成
- 28. writeToFile如何知道它何時完成
- 29. 如何知道何時安裝完成?
- 30. 如何知道綁定何時完成?
當一個任務('Runnable')T產生另外n個任務時,你會說這個任務T在完成所有這些任務後完成嗎?那麼任務T和它的子任務之間是否存在(概念上的)依賴關係? – isnot2bad 2015-04-04 22:05:25
對。我遺漏了我正在使用'newFixedThreadPool',其中最大運行線程數是處理器數量。一旦有人可以運行,其他人就不會再有任何工作要做。如果它等到它產生的runnables結束,它就會坐在那裏什麼都不做,並且由於線程數量的限制,程序永遠不會結束。 – user2980766 2015-04-04 22:51:18
因此,您應該使用'ForkJoinTask'。 – isnot2bad 2015-04-04 23:36:45