Это, безусловно, возможно, если вы гибко относитесь к тому, что происходит с элементами, попадающими в начало очереди, которые не не соответствуют вашим критериям.
Одним простым способом было бы что-то вроде
while (true) {
Message message = blockingQueue.take();
if ( !message.author.equals(expectedAuthor) ) {
continue;
}
}
Теперь, если вам интересно, можете ли вы cherry-pick элементов из очереди, оставив другие элементы на месте, то нет, это невозможно с типом данных очереди. Вы можете заставить его работать с какой-то Deque (двусторонней очередью), где вы помещаете элементы, которые вам не нужны, во временный стек, а затем снова вставляете их обратно, когда найдете нужный. Но вам определенно лучше использовать отдельную очередь, которая содержит только те элементы, которые вас интересуют.
Например, у вас может быть поток, который потребляет каждое сообщение в очереди, а затем повторно отправляет его в более конкретную очередь:
Map<String, BlockingQueue<Message>> authorQueues;
BlockingQueue<Message> allMessages;
while(true) {
Message nextMessage = allMessages.take();
authorQueues.get(nextMessage.getAuthor()).put(nextMessage);
}
Затем настройте своего потребителя на использование правильной очереди авторов.