是否可以在有界队列中使用毒丸方法?

2022-09-02 13:50:51

在Java并发实践书(p.156)中,有一个关于毒丸方法的陈述:

毒丸仅在未绑定队列中可靠地工作。

这是否意味着使用有界队列,我可能会陷入死锁,还是关于其他一些活动问题?它是否与生产者和客户的数量有关?


答案 1

使用有界队列,可以阻止您添加毒丸。

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


答案 2

问题是队列在关闭时间可能已满。

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

当需要关闭队列时,在添加毒丸之前先排干队列应该是有效的。

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)) ;
}

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

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


推荐