首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LinkedBlockingQueue中的“转义”元素

LinkedBlockingQueue中的“转义”元素
EN

Stack Overflow用户
提问于 2011-12-17 02:57:27
回答 3查看 169关注 0票数 0

我正在遍历LinkedBlockingQueue的数百万个字符串。当源代码中没有更多的项时,读取线程应该结束其执行。

我想过在LinkedBlockingQueue中放一个像"SHUTDOWN"这样的虚拟值。

阅读器这样做:

代码语言:javascript
复制
while ((data = (String)MyLinkedBlockingQueue.take()).equals("SHUTDOWN") == false) {
    //read and live 
}

对每个字符串执行equals是否有效?如果不是,我可以使用什么来代替?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-17 03:17:23

你在正确的轨道上。这是完成BlockingQueue处理的标准用法,它被称为“毒丸”。我通常使用一个特殊的私有静态final实例来实现它,这样你就可以实现对象相等,而不会冒着与实际值重叠的风险。例如:

代码语言:javascript
复制
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);
}
票数 2
EN

Stack Overflow用户

发布于 2011-12-17 03:13:50

您还可以考虑使用poll(),并在循环返回null时结束循环。

票数 0
EN

Stack Overflow用户

发布于 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?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8538840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档