есть ли очередь блокировки в Java, которая позволяет только заглянуть?

Мне нужна очередь блокировки размером 1, и каждый раз, когда применяется put, она удаляет последнее значение и добавляет следующее. Потребители будут пулом потоков, в котором каждый поток должен прочитать сообщение, когда оно будет помещено в очередь, и решить, что с ним делать, но они не должны иметь возможность брать из очереди, поскольку все они должны читать от него.

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

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


person adnan_252    schedule 18.04.2014    source источник
comment
Разве вы не можете создать подкласс или украсить существующую очередь, чтобы добиться этого?   -  person Alexander Kulyakhtin    schedule 18.04.2014
comment
Просто для ясности: если появится производитель, а не все потоки-потребители прочитают единственный буфер, вы хотите, чтобы он блокировался до тех пор, да?   -  person Martin James    schedule 18.04.2014
comment
@MartinJames да, надеюсь, это не будет слишком большой проблемой, поскольку все потребители - это отдельные потоки. Они могли просто прочитать хвост, но это, вероятно, приведет к переполнению стека, когда будет добавлено определенное количество сообщений.   -  person adnan_252    schedule 18.04.2014
comment
Кроме того, просто для ясности, потребители будут блокироваться, если сообщение все еще является тем, которое они получили ранее, даже если у производителя есть следующее доступное сообщение, но оно заблокировано, поскольку не все клиенты просмотрели?   -  person bowmore    schedule 18.04.2014
comment
@bowmore да, это должно быть так. Потребителям придется просматривать очередь, блокируя ее, а затем освобождая контроль для остальных потребителей. Возможно, мне придется прибегнуть к реализации интерфейсов наблюдателя для потребителей, но это также будет означать переписывание кода производителя.   -  person adnan_252    schedule 18.04.2014


Ответы (1)


После некоторого размышления я думаю, что вам будет лучше, если у каждого потребителя будет своя очередь, а производитель поместит свои сообщения во все очереди.

  • Если потребителей немного, размещение сообщений в этих нескольких очередях не займет много времени (за исключением случаев, когда производитель блокируется, потому что потребитель не может идти в ногу).
  • Если есть много потребителей, эта ситуация будет гораздо предпочтительнее, чем ситуация, когда многие потребители конфликтуют друг с другом.

По крайней мере, это было бы хорошей мерой для сравнения альтернативных решений.

person bowmore    schedule 19.04.2014
comment
Спасибо за ответ. - person adnan_252; 21.04.2014