2011-10-06 251 views
1

我已經爲生產者和消費者實現了一個信號燈類。Java:信號量:生產者消費者:線程和線程組

它工作正常,但我現在感覺我們使用notifyAll來通知線程醒來或通知所有線程。

我想知道是否有任何方法可以讓我們只通知一組特定的組:比如生產者只通過組或其他方式通知消費者線程,反之亦然。 PS:我是java和Threading的新手。

+0

這些組的規則是什麼?如果它們不重疊,那就沒有問題 - 只需爲每個組使用不同的隊列(以及信號量)。 –

回答

5

對我來說就像你在重新發明輪子。 Semaphores可在java.util.concurrent package

此外,對於生產者/消費者數據結構,我建議你只需使用BlockingQueue

無論如何,notify方法通知一個(未指定)服務員。如果你確實需要一個特定的「訂單」,我相信你將不得不notifyAll和「手動」,確保只有相關的被允許獲取信號量。


對於你特定的情況下,在我看來,像你需要一個等待設置生產者和消費者一個等待設定。由於每個對象都有一個等待集,因此不可能僅使用一個對象通知消費者(或生產者)。也許你所追求的是兩個對象,一個是生產者獲得的,另一個是消費者獲得的對象,然後執行consumerObj.notifyAll()producerObj.notifyAll(),這取決於你想喚醒哪一組線程。

+0

但仍然我的問題仍然存在,如果有任何方式我只能通知一組線程或線程組? –

+1

對,我的回答是,不,我的知識水平不高。你必須在'notify' /'notifyAll'原語之上實現這樣的功能*。 – aioobe

0
Thread arr [] = new Thread[10];   
     ThreadGroup group = new ThreadGroup("test"); 
     group.enumerate(arr); 
     group.notifyAll(); 
+1

uhm,'group.notifyAll'會通知所有已經運行'synchronized(group){... wait();}的線程。 '' – aioobe