我正在绕过LinkedBlockingQueue
数百万个字符串。
当源中没有更多项时,读取线程应该结束执行。
我考虑在"SHUTDOWN"
中添加LinkedBlockingQueue
这样的虚拟值。
读者这样做:
while ((data = (String)MyLinkedBlockingQueue.take()).equals("SHUTDOWN") == false) {
//read and live
}
在每个字符串上执行equals是否有效?如果不是我可以使用什么呢?
答案 0 :(得分:2)
你走在正确的轨道上。这是完成BlockingQueue处理的标准习惯用法,它被称为“毒丸”。我通常使用一个特殊的私有静态最终实例来实现它,这样你就可以做对象相等而不冒险与实际值重叠。 e.g:
private static final String SHUTDOWN = new String("SHUTDOWN"); // use new String() so you don't get an interned value
public void readQueue() {
while ((data = (String)MyLinkedBlockingQueue.take()) != SHUTDOWN) {
//read and live
}
}
public void shutdownQueue() {
MyLinkedBlockingQueue.put(SHUTDOWN);
}
答案 1 :(得分:0)
您还可以考虑使用poll()
并在返回null时结束循环。
答案 2 :(得分:0)
这可以实施,这样您就不必每次都检查“毒丸”。考虑使用适用于LinkedBlockingQueue
的{{3}}。如果要关闭处理,请在执行程序对象上调用ThreadPoolExecutor
方法。从该方法的文档:
启动以前提交的任务的有序关闭 已执行,但不会接受任何新任务。调用没有 如果已经关闭,则会产生额外的影响。
如果您有兴趣在队列中的任务仍未处理时立即关闭处理,请参阅此帖子:shutdown()