2011-11-29 115 views
4

我想執行下面的算法 - 這必須用Java做Java的線程池同步

for(int i = 0; i< 100; i++){ 
    create 8 threads which perform a task 
    wait for all threads to finish 
} 

希望的是,線程不會繼續創建和銷燬由於管理費用(而事實上,每個線程將會有20milli秒的工作),這帶來了線程池1的想法。我也知道使用可執行文件2,可以調用shutdown,然後等待終止。然而,在這種情況下由於循環而不可取。那麼線程同步如何發生?

我想同步線程池中的線程,就像使用傳統線程的join()方法所做的那樣。

+1

問題不明確。您創建100次8個線程或者您在8個線程中處理100個任務?你需要同步什麼(你同步數據,而不是線程)? – toto2

+0

您確定在開始新任務之前您必須等待所有8個任務完成嗎?如果你需要8個線程,因爲你有一個8核心的機器,那麼你只需要使用一個8線程的ThreadPool。 – toto2

回答

4

你試過看過Cyclic Barrier。它被優化爲允許一組線程停下來等待,直到每個人都達到共同的障礙。我看不出有什麼理由說明爲什麼它不能與已知數量的共用線程一起使用並引用共同障礙。如果您需要在與障礙await()調用的回調中進行同步,則可能會有一些額外的複雜性,因爲它在不同的線程中執行了計數。

+0

謝謝,這看起來很有幫助。我將嘗試將循環屏障與線程池耦合併發布我的結果。不過,我想指出的是,假設我對功能感興趣是錯誤的,我只需要一個應用程序,我希望通過需要同步的線程來加快速度。 – ET13

0

看一看叉/加入JDK 7

+0

謝謝,我已閱讀過此處的Fork/Join Framework(http://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html),但因爲它旨在用於遞歸而被阻止使用它算法,而我試圖實現的算法更容易迭代實現。另外我有一個固定數量的線程,我希望這個線程能夠運行,而這個算法更適合於將任務分成小部分工作單元,並允許Fork/Join相應地確定如何最好地使用資源。 – ET13

2

你需要堅持隊列中的所有任務,然後喂隊列爲ThreadPoolExecutor的框架。您告訴線程池執行程序要使用多少個線程,並負責執行任務。

+0

但是這並不能解決同步的問題,如果我沒有弄錯的話? – ET13

+0

如果您確實需要它(如果是這樣,爲什麼您的任務列表不是8的倍數?),您可以一次將任務放入任務隊列8中並覆蓋'ThreadPoolExecutor.afterExecute()'以檢查是否所有任務已經完成,如果有的話,再增加8個隊列。 – TMN