是否可以在有界队列中使用毒丸方法?
2022-09-02 13:50:51
在Java并发实践书(p.156)中,有一个关于毒丸方法的陈述:
毒丸仅在未绑定队列中可靠地工作。
这是否意味着使用有界队列,我可能会陷入死锁,还是关于其他一些活动问题?它是否与生产者和客户的数量有关?
在Java并发实践书(p.156)中,有一个关于毒丸方法的陈述:
毒丸仅在未绑定队列中可靠地工作。
这是否意味着使用有界队列,我可能会陷入死锁,还是关于其他一些活动问题?它是否与生产者和客户的数量有关?
使用有界队列,可以阻止您添加毒丸。
避免此问题的一种方法是使有界队列在添加毒丸时允许更多。
问题是队列在关闭时间可能已满。
这取决于关闭时队列中数据的价值。你能负担得起把队列里的所有东西都扔掉吗?
当需要关闭队列时,在添加毒丸之前先排干队列应该是有效的。
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
另请记住,在毒丸之后,可能会有更多的项目添加到队列中,因为不仅队列可能已满,而且还可能有线程被阻止等待发布到它。