Мне кажется, ты изобретаешь колесо. Семафоры доступны в пакете java.util.concurrent
.
Кроме того, для структуры данных производителя / потребителя, я бы предложил вам просто использовать BlockingQueue
.
В любом случае, метод notify
уведомляет одного (неуказанного) официанта. Если вам действительно нужен конкретный «порядок», по которому можно пропустить, я полагаю, вам придется notifyAll
и «вручную» убедиться, что только релевантные могут получить семафор.
В вашем конкретном случае мне кажется, что вам нужен один набор ожидания для производителей и один набор ожидания для потребителей. Поскольку для каждого объекта установлено одно ожидание, невозможно уведомить только потребителей (или производителей) об одном объекте. Возможно, вам нужно иметь два объекта, один приобретенный производителями, а другой приобретенный потребителями, а затем выполните consumerObj.notifyAll()
или producerObj.notifyAll()
, в зависимости от того, какую группу потоков вы хотите активировать.