У меня есть следующий код:Java - Несколько очередей производитель потребительских
while(!currentBoard.boardIsValid()){
for (QueueLocation location : QueueLocation.values()){
while(!inbox.isEmpty(location)){
Cell c = inbox.dequeue(location);
notifyNeighbours(c.x, c.y, c.getCurrentState(),previousBoard);
}
}
}
У меня потребителя несколько очередей (все их методы синхронизируются). Одна очередь для каждого производителя. Потребитель перебирает все очереди и проверяет, есть ли у них задача для его потребления. Если в очереди, в которой он проверяет, есть задача, она его потребляет. В противном случае он переходит к проверке следующей очереди, пока не закончит итерацию по всем очередям.
На данный момент, если он выполняет итерации по всем очередям, и все они пустые, он продолжает зацикливаться, а не ждет, когда один из них будет содержать что-то (как видно внешним while
).
Как заставить пользователя подождать, пока в одной из очередей не появится что-то?
У меня возникла проблема со следующим сценарием: Допустим, что всего 2 очереди. Потребитель проверил первый, и он был пуст. Так же, как он проверяет второй (который также пуст), производитель помещает что-то в первую очередь. Что касается потребителя, очереди остаются пустыми, и поэтому он должен ждать (хотя один из них больше не пуст, и он должен продолжать цикл).
Редактировать: Последнее обновление. Это упражнение для меня. Я пытаюсь реализовать синхронизацию самостоятельно. Поэтому, если в какой-либо из java-библиотек есть решение, которое реализует это, я не заинтересован в этом. Я пытаюсь понять, как я могу это реализовать.
Если вы не можете изменить производителей, чтобы сделать дополнительный сигнал/уведомление, существует два типа решения: 1) использовать тайм-аут и найти компромисс между потреблением процессора и отказоустойчивостью или 2) использовать дополнительные потоки, ожидающие очередей и уведомление потребителя. Дополнительные потоки второго подхода будут потреблять больше памяти, но не будут значительного времени процессора, поскольку они в основном ждут. – Holger