У меня есть сервис, который я хотел бы реализовать как Google Guava Service
.
Служба в основном запускает цикл while (true)
, который обрабатывает события по мере их поступления на BlockingQueue
. Упрощенный пример кода доступен здесь:
https://gist.github.com/3354249
Проблема в том, что код блокируется на BlockingQueue#take()
, поэтому единственный способ остановить службу — прервать ее поток. Возможно ли это с помощью AbstractExecutionThreadService
Гуавы?
Конечно, в этом случае я мог бы заменить queue.take()
циклом опроса, используя queue.poll(1, TimeUnit.SECONDS)
, таким образом устранив необходимость прерывания потока. Однако:
Я хотел бы избежать этого как по соображениям производительности, так и по причинам читабельности кода
Есть и другие случаи, когда невозможно избежать прерывания потока, например. если служба заблокирована при чтении байтов из InputStream
.