是否可以使用有毒队列的毒丸方法?

Bor*_*hov 17 java concurrency multithreading

在Java Concurrency In Practice一书(第156页)中,有关于毒丸方法的陈述:

毒丸只能在未绑定的队列中可靠地工作.

这是否意味着有限的队列我可以陷入僵局,或者是关于其他一些活动问题?它与生产者和顾客的数量有关吗?

Pet*_*rey 7

使用有界队列,可以防止添加毒丸.

避免此问题的一种方法是在添加毒丸时使有界队列再允许一个.

  • 另一种方法(假设阻塞队列)是使用对象池进行线程间通信,并确保每个队列的容量大于系统中可用对象的总数.然后,所有队列将始终有足够的备用容量来容纳药丸. (2认同)

Old*_*eon 6

问题是队列可能在关闭时填满.

这取决于关闭时队列中数据的价值.你能负担得起把所有东西扔进去吗?

当关闭队列时,在添加毒丸之前排空队列应该是有效的.

void close () throws InterruptedException {
  do {
    // Empty the queue.
    while ( queue.poll(0,TimeUnit.MILLISECONDS) != null ) {
      // Throw it away.
    }
    // Keep draining the queue 'till the pill is swallowed.
  } while (!queue.offer(STOP, 0, TimeUnit.MILLISECONDS)) ;
}
Run Code Online (Sandbox Code Playgroud)

但是当然如果队列中的项目很有价值,您可能希望使用drainto并保留它们.

还请记住,在毒丸之后可能会有更多项目添加到队列中,因为不仅队列可能已满,而且可能还有线程被阻止等待发布到它.