2011-10-06 259 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