Как сказал alphazero , если у вас возникло узкое место, число ожидающих заданий на стороне клиента будет продолжать расти независимо от того, какой подход вы используете.
Реальный вопрос в том, как вы хотите справиться с узким местом. Или, более правильно, как вы хотите, чтобы ваши пользователи справились с узким местом.
Если вы используете неограниченную очередь, вы не получите сообщение о том, что произошло узкое место. И в некоторых приложениях это нормально: если пользователь запускает асинхронные задачи, то нет необходимости сообщать о невыполненных заданиях (при условии, что оно в конечном итоге очищается). Однако, если пользователю нужно дождаться ответа перед выполнением следующей задачи на стороне клиента, это очень плохо.
Если вы используете LinkedBlockingQueue.offer()
в ограниченной очереди, вы сразу получите ответ, в котором говорится, что очередь заполнена, и можете предпринять такие действия, как отключение определенных функций приложения, появление диалогового окна, что угодно. Это, однако, потребует дополнительной работы с вашей стороны, особенно если запросы могут быть отправлены из нескольких мест. Я бы посоветовал, если у вас его еще нет, вы создаете слой с поддержкой графического интерфейса поверх очереди сервера, чтобы обеспечить общее поведение.
И, конечно же, никогда не звоните LinkedBlockingQueue.put()
из потока событий (если вы не возражаете против зависшего клиента, то есть).