我已经为生产者和消费者实现了一个信号灯类。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
这些组的规则是什么?如果它们不重叠,那就没有问题 - 只需为每个组使用不同的队列(以及信号量)。 –