Java LinkedBlockingQueue能否在完成时发出信号?

Yon*_*Yon 6 java producer-consumer

我有一个生产者和单个消费者使用对象队列的情况.队列可能为空时有两种情况:

  1. 消费者处理对象的速度比生产者能够生成新对象的速度快(生成者在生成对象之前使用I/O).
  2. 生产者完成了生成对象.

如果队列为空,我希望消费者等到新对象可用或者直到生产者发出信号表明它已完成为止.

到目前为止,我的研究没有让我失望,因为我仍然得到了一个循环来检查队列和一个单独的布尔标志(isDone).鉴于没有办法等待多个锁(想到等待队列和标志),可以做些什么来解决这个问题?

Sea*_*lly 2

首先,使用包装器“开销太大”的建议只是一种猜测,在我看来这是一个非常糟糕的猜测。这个假设应该通过实际需求的性能测试来衡量。当且仅当测试失败时,才使用探查器验证包装队列对象是否是原因。

尽管如此,如果您这样做并且包装队列对象(在本例中为字符串)确实是导致性能不可接受的原因,那么您可以使用此技术:创建一个已知的唯一字符串来充当“消息结束”消息。

    public static final String NO_MORE_MESSAGES = UUID.randomUUID().toString();
Run Code Online (Sandbox Code Playgroud)

然后,当从队列中检索字符串时,只需检查(可以是引用检查)该字符串是否为NO_MORE_MESSAGES。如果是这样,那么您就完成了处理。