我已經爲生產者和消費者實現了一個信號燈類。Java:信號量:生產者消費者:線程和線程組
它工作正常,但我現在感覺我們使用notifyAll來通知線程醒來或通知所有線程。
我想知道是否有任何方法可以讓我們只通知一組特定的組:比如生產者只通過組或其他方式通知消費者線程,反之亦然。 PS:我是java和Threading的新手。
我已經爲生產者和消費者實現了一個信號燈類。Java:信號量:生產者消費者:線程和線程組
它工作正常,但我現在感覺我們使用notifyAll來通知線程醒來或通知所有線程。
我想知道是否有任何方法可以讓我們只通知一組特定的組:比如生產者只通過組或其他方式通知消費者線程,反之亦然。 PS:我是java和Threading的新手。
對我來說就像你在重新發明輪子。 Semaphores可在java.util.concurrent
package。
此外,對於生產者/消費者數據結構,我建議你只需使用BlockingQueue
。
無論如何,notify
方法通知一個(未指定)服務員。如果你確實需要一個特定的「訂單」,我相信你將不得不notifyAll
和「手動」,確保只有相關的被允許獲取信號量。
對於你特定的情況下,在我看來,像你需要一個等待設置生產者和消費者一個等待設定。由於每個對象都有一個等待集,因此不可能僅使用一個對象通知消費者(或生產者)。也許你所追求的是兩個對象,一個是生產者獲得的,另一個是消費者獲得的對象,然後執行consumerObj.notifyAll()
或producerObj.notifyAll()
,這取決於你想喚醒哪一組線程。
但仍然我的問題仍然存在,如果有任何方式我只能通知一組線程或線程組? –
對,我的回答是,不,我的知識水平不高。你必須在'notify' /'notifyAll'原語之上實現這樣的功能*。 – aioobe
Thread arr [] = new Thread[10];
ThreadGroup group = new ThreadGroup("test");
group.enumerate(arr);
group.notifyAll();
uhm,'group.notifyAll'會通知所有已經運行'synchronized(group){... wait();}的線程。 '' – aioobe
這些組的規則是什麼?如果它們不重疊,那就沒有問題 - 只需爲每個組使用不同的隊列(以及信號量)。 –