如何通知其他对象(如何"关闭"队列)ArrayBlockingQueue中不再有元素,

时间:2015-04-25 07:44:49

标签: java blockingqueue

我有一个ArrayBlockingQueue<String> queue;和一个Author对象将元素放在那里:

public static final String END = "db8097f51282a0188e988d6bfa994430258e24ce";

[...]

for (String text : texts) {
            queue.put(text);
            Thread.sleep(300);
        }
queue.put(END);

和一个Printer个对象,它们从qeue中获取元素并将它们打印在控制台上:

 String text;
 do {
     text = queue.take();
     if (!text.equals(Author.END))
            System.out.println(text);
} while (tekst != Author.END);

我想通知Printer对象,不会有更多元素放入qeue。我无法将null传递给ArrayBlockingQueue,所以我决定在内部传递非常不寻常的String。我认为这是不好的解决方案。

我可以以某种方式关闭ArrayBlockingQueue吗?

1 个答案:

答案 0 :(得分:0)

你的解决方案似乎很好。要考虑两点:

  • 如果您要让多个打印机读取同一队列中的值,您可能希望打印机将END值推回队列,以便其他打印机有机会看到它
  • 考虑不仅存储普通字符串,而是存储您定义的类的对象。该类可以有一个字符串字段来承载实际的有效负载和额外的布尔字段,例如'isEnd`。这将使您的代码中的常规项和队列结束项之间的区别更明确。