Могу ли я использовать AbstractExecutionThreadService Guava для служб, которые необходимо прервать?

У меня есть сервис, который я хотел бы реализовать как Google Guava Service.

Служба в основном запускает цикл while (true), который обрабатывает события по мере их поступления на BlockingQueue. Упрощенный пример кода доступен здесь:

https://gist.github.com/3354249

Проблема в том, что код блокируется на BlockingQueue#take(), поэтому единственный способ остановить службу — прервать ее поток. Возможно ли это с помощью AbstractExecutionThreadServiceГуавы?

Конечно, в этом случае я мог бы заменить queue.take()циклом опроса, используя queue.poll(1, TimeUnit.SECONDS), таким образом устранив необходимость прерывания потока. Однако:

  • Я хотел бы избежать этого как по соображениям производительности, так и по причинам читабельности кода

  • Есть и другие случаи, когда невозможно избежать прерывания потока, например. если служба заблокирована при чтении байтов из InputStream.

5
задан Chris B 15 August 2012 в 00:51
поделиться