我正在實現一個具有多線程的並行性能關鍵算法。我將所有線程分配給一些數據。當全部那些線程已完成處理其數據,我分配所有線程的新數據,並繼續循環。 (這是我所說的線程「時鐘」,因爲它有點類似於CPU時鐘。)Java - 逐步線程
我到目前爲止使用的是使用存儲整數的主線程。在每個週期開始時,我將整數設置爲從屬線程的數量。當一個從線程完成時,它減少主線程的整數。一旦這個整數達到零,我開始一個新的循環。
這是一個好方法,還是有更有效的方法來做同樣的事情?
我正在實現一個具有多線程的並行性能關鍵算法。我將所有線程分配給一些數據。當全部那些線程已完成處理其數據,我分配所有線程的新數據,並繼續循環。 (這是我所說的線程「時鐘」,因爲它有點類似於CPU時鐘。)Java - 逐步線程
我到目前爲止使用的是使用存儲整數的主線程。在每個週期開始時,我將整數設置爲從屬線程的數量。當一個從線程完成時,它減少主線程的整數。一旦這個整數達到零,我開始一個新的循環。
這是一個好方法,還是有更有效的方法來做同樣的事情?
你會更好使用Phaser(如果你有Java 7中),或CyclicBarrier爲Java 5+。
我建議看一下java.util.concurrent包中的新類,特別是ThreadPoolTaskExecutor
。如果你沒有看過java.lang.Thread
以外的地方,你可能會重新發明輪子。
好吧。請參閱CyclicBrier(JavaDoc)
更好的方法是使用Thread.join()。在你的主線程中,你在所有你開始的線程上調用join()。主線程將等待直到所有連接的線程完成。
見例如http://javahowto.blogspot.com/2007/05/when-to-join-threads.html
ExecutorService
可以爲你做到這一點。
ExecutorService executor = Executors.newFixedThreadPool(10);
do {
List<Callable> tasks = getNextTasksToExecute();
executor.invokeAll(tasks);
} while (tasks.size() > 0);
這將創建一個包含10個線程的線程池。然後它會調用getNextTasksToExecute()
,您應該自己實現以返回需要執行的下一組任務。它將在線程池中並行執行這些任務,然後繼續循環直到getNextTasksToExecute()
不返回任務。
編輯:
代碼未經測試,認爲可能存在編譯錯誤,但您可以弄清楚。
正確的術語是階段性的:D –
@Chris Dennett:謝謝,有時解決一個問題最難的部分是找出谷歌應該做些什麼;) – ryyst
..只要遞減是線程安全的。 –