我正在遍历LinkedBlockingQueue的数百万个字符串。当源代码中没有更多的项时,读取线程应该结束其执行。
我想过在LinkedBlockingQueue中放一个像"SHUTDOWN"这样的虚拟值。
阅读器这样做:
while ((data = (String)MyLinkedBlockingQueue.take()).equals("SHUTDOWN") == false) {
//read and live
}对每个字符串执行equals是否有效?如果不是,我可以使用什么来代替?
发布于 2011-12-17 03:17:23
你在正确的轨道上。这是完成BlockingQueue处理的标准用法,它被称为“毒丸”。我通常使用一个特殊的私有静态final实例来实现它,这样你就可以实现对象相等,而不会冒着与实际值重叠的风险。例如:
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);
}发布于 2011-12-17 03:13:50
您还可以考虑使用poll(),并在循环返回null时结束循环。
发布于 2011-12-17 03:24:53
这可以实现,这样你就不必每次都检查“毒丸”了。考虑使用在您的LinkedBlockingQueue上工作的ThreadPoolExecutor。当您想要关闭处理时,调用executor对象上的shutdown()方法。来自该方法的文档:
启动有序关闭,在此过程中将执行以前提交的任务,但不接受任何新任务。如果已经关闭,则调用不会产生额外的影响。
如果您有兴趣在任务仍在队列中等待时立即关闭处理,请参阅这篇文章:With a Java ExecutorService, how do I complete actively executing tasks but halt the processing of waiting tasks?
https://stackoverflow.com/questions/8538840
复制相似问题