Поток обработчика запросов создает BlockingQueue с именем myQueue и передает его рабочему потоку, который после завершения помещает свой результат в очередь.Затем поток обработчика вызывает «myQueue.poll(X, TimeUnit.SECONDS)
» и возвращает сериализованный результат, если он получает одну или вашу ошибку «тайм-аута», если вместо этого он получает значение «ноль» (имеется в виду тайм-аут вызова «опрос»).Вот пример того, как это может выглядеть:
// Servlet handler method.
BlockingQueue<MyResponse> queue = new ArrayBlockingQueue<MyResponse>();
Thread worker = new Thread(new MyResponseGenerator(queue));
worker.start();
MyResponse response = queue.poll(10, TimeUnit.SECONDS);
if (response == null) {
worker.interrupt();
// Send "timeout" message.
} else {
// Send serialized response.
}
Обратите внимание, что управление потоками в целом (но особенно в контейнере сервлета) полно ловушек, поэтому вы должны очень хорошо ознакомиться со спецификацией и поведением сервлетавашего конкретного контейнера сервлета перед использованием этого шаблона в производственной системе.
Использование ThreadPool - это еще один вариант, который следует рассмотреть, но добавит еще один уровень сложности.