LinkedBlockingQueue中的“escape”元素

时间:2011-12-16 18:57:27

标签: java

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

我考虑在"SHUTDOWN"中添加LinkedBlockingQueue这样的虚拟值。

读者这样做:

while ((data = (String)MyLinkedBlockingQueue.take()).equals("SHUTDOWN") == false) {
    //read and live 
}

在每个字符串上执行equals是否有效?如果不是我可以使用什么呢?

3 个答案:

答案 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()