По сути, вы говорите о мультиплексировании, и нет, в стандартной библиотеке чего-то нет, но создать его довольно просто.Предполагая, что ваши клиенты не заинтересованы в сообщениях, опубликованных до их подписки, вам нужен пул очередей для каждого потребителя, и публикация просто предлагает элемент для каждой очереди:
public class Multiplexer<M> {
private final List<BlockingQueue<M>> consumers
= new CopyOnWriteArrayList<BlockingQueue<M>>();
public void publish(M msg) {
for (BlockingQueue<M> q : consumers) {
q.offer(msg);
}
}
public void addConsumer(BlockingQueue<M> consumer) {
consumers.add(consumer);
}
}
Эта версия позволяет потребителям использовать любыереализация блокировки очереди, которую они могли бы хотеть.Очевидно, вы могли бы предоставить стандартную реализацию и хороший интерфейс для клиента, если хотите.