Я согласен с ответом, представленным до меня, однако я вижу пример использования, подобный этому, очень распространенному на практике. Я добавляю свои два цента. В некоторых случаях может быть допустимо, если вы не хотите выполнять трудоемкую работу в потоке onMessage (который извлекает сообщение из Q)
У нас есть что-то похожее в одном рабочем процессе, где, если пользователь выбирает какую-либо опцию XYZ в графическом интерфейсе, это означает, что на сервере нам нужно подключиться к другому внешнему веб-сервису, чтобы получить ABCD, в этом случае мы не выполняем вызов веб-сервиса в onMessage Thread и используем ThreadPool для отправки и обработки этого вызова.
Если во время вызова веб-службы происходит что-то не так, мы передаем это в GUI как отдельное сообщение, существует концепция идентификатора запроса, который сохраняется в сообщениях, чтобы GUI мог связывать сообщения об ошибках. Вы можете использовать реализацию ExecutorService для отправки задачи.
надеюсь, это поможет.