我有一项服务,我希望作为Google Guava Service
实施。我可以使用Guava的AbstractExecutionThreadService来处理需要中断的服务吗?
该服务基本上运行一个while (true)
循环,它在到达BlockingQueue
时处理事件。简化的示例代码,请访问:
https://gist.github.com/3354249
的问题是,在BlockingQueue#take()
代码块,所以要停止该服务的唯一方法是中断它的线程。这可能使用番石榴的AbstractExecutionThreadService
?
当然,在这种情况下,我可以用queue.poll(1, TimeUnit.SECONDS)
替代queue.take()
轮询循环,从而消除线程中断的需要。但是:
我想避免这样做,对性能和代码的可读性原因
还有其他一些情况下,这是无法避免的线程中断,例如如果服务在从
InputStream
读取字节时被阻止。
感谢您的解释。我会尝试编写自己的'AbstractService'实现。我认为可以向Guava添加这种功能,因为它似乎是一种常见的需求。 – 2012-08-16 00:40:59