Java: семафор: производитель потребитель: потоки и группа потоков - PullRequest
1 голос
/ 06 октября 2011

Я реализовал семафорный класс для производителя и потребителя.

Он работает нормально, но сейчас я чувствую, что мы используем notifyAll для уведомления потоков, которые пробуждают или уведомляют все потоки.

Я хочу знать, есть ли какой-нибудь способ, которым мы можем уведомлять только определенный набор групп: как производители только уведомляют потребительские потоки и наоборот, используя группы или что-то еще.

PS: я новичокв Java и Threading.

Ответы [ 2 ]

5 голосов
/ 06 октября 2011

Мне кажется, ты изобретаешь колесо. Семафоры доступны в пакете java.util.concurrent .

Кроме того, для структуры данных производителя / потребителя, я бы предложил вам просто использовать BlockingQueue.

В любом случае, метод notify уведомляет одного (неуказанного) официанта. Если вам действительно нужен конкретный «порядок», по которому можно пропустить, я полагаю, вам придется notifyAll и «вручную» убедиться, что только релевантные могут получить семафор.


В вашем конкретном случае мне кажется, что вам нужен один набор ожидания для производителей и один набор ожидания для потребителей. Поскольку для каждого объекта установлено одно ожидание, невозможно уведомить только потребителей (или производителей) об одном объекте. Возможно, вам нужно иметь два объекта, один приобретенный производителями, а другой приобретенный потребителями, а затем выполните consumerObj.notifyAll() или producerObj.notifyAll(), в зависимости от того, какую группу потоков вы хотите активировать.

0 голосов
/ 06 октября 2011
Thread arr [] = new Thread[10];          
        ThreadGroup group = new ThreadGroup("test");
        group.enumerate(arr);
        group.notifyAll();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...