В ваших требованиях указано, что вы собираетесь поместить значения в очередь, когда она пуста - я понимаю, что это несколько значений, а не одно. Если ваши требования немного изменились, чтобы сказать, что вы помещаете один элемент в очередь и ждете, пока он не израсходуется, прежде чем поставить другой, тогда вы будете готовы использовать java.util.concurrent.Exchanger
.
Его поведение аналогично BlockingQueue
глубины один, но делает это немного больше: он передает объект в обоих направлениях, где каждый участник является и «производителем», и «потребителем». , Следовательно, Exchanger
не примет предложение товара «производителем», пока «потребитель» также не будет готов предложить товар обратно. Это не «огонь и забудь» для «продюсера»; сроки производства и потребления взаимосвязаны. Это не позволяет фактическому производителю затопить рабочую очередь потребителя - опять же, как BlockingQueue
, - но также останавливает производителя, пока потребитель не завершит последний раунд работы.
В вашем случае у потребителя может не быть ничего полезного для возврата производителю. В любом случае, вы можете сформировать протокол между участниками. Когда производитель хочет отключить потребительский поток, он может предложить нулевое значение. Как только потребитель принимает нулевое значение, производитель может сделать еще один раунд обмена, чтобы завершить запрос на отключение и получить любой конечный результат от потребителя.