2012-04-19 198 views
1

我有一些developpements要做,我試着看看是否有一個設計模式使用。 問題很簡單:java線程:生產者 - 消費者

我有許多啓動胎面一個主線程。主線程必須等待每個線程完成,然後執行其他操作。 現有的代碼有點難看。我有一個while循環檢查線程組,看看是什麼運行:

//launch threads 
..... 
//wait for threads to finish 
while (ThreadRepository.getInstance().isActiveThreadGroup(myGroupId)) { 
    Thread.sleep(5000); 
} 

//doing something else 

所以,你看,while循環繼續運行,直到沒有線程運行。

我想在模式生產者 - 消費者,我願做這樣的事情:

使用BlockingQueue的一些比如,每個線程放(或服用)在它的東西。 而不是有時間和睡眠我想有像 myQueue.take()東西,但等待隊列是空的。 當爲空時,表示沒有線程在運行。

我嘗試在互聯網上搜索,但我沒有發現匹配我的問題的東西。

有沒有人知道最有效地解決我的問題?

+0

如果提前確定了參數的數量,則可以使用'CountDownLatch'。 – 2012-04-19 08:54:31

+0

Marko,你是什麼意思,「沒有返回貢獻者的青睞」? – 2012-04-19 09:32:26

回答

2

有兩種簡單的方法有一個線程等待N個線程來完成:

  1. 使主線程調用join()方法在所有其他線程。 join()方法返回當一個線程完成,或已完成
  2. 創建N初始化的CountDownLatch,該鎖存傳遞給所有線程,使每個線程調用countDown()上時,它已經完成了插銷,使主線程調用閂鎖上的await()。第二種技術比第一種技術要難一些,但它也更加靈活和可重用,並且允許在延遲之後被喚醒,即使N個線程尚未完成。
+0

謝謝。我不知道這堂課。這正是我需要的。我已經測試過,它像一個魅力。 – 2012-04-19 09:22:29

0

可以使用的BlockingQueue如下:

  • 每個子線程結束時

  • 主線程從隊列中取出消息,並計算它們在隊列中放消息。當消息數量等於線程數時,所有線程都已完成。

+0

是的,這個想法也不錯。 – 2012-04-19 09:37:09