Bor*_*hov 17 java concurrency multithreading
在Java Concurrency In Practice一书(第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)) ;
}
Run Code Online (Sandbox Code Playgroud)
但是当然如果队列中的项目很有价值,您可能希望使用drainto
并保留它们.
还请记住,在毒丸之后可能会有更多项目添加到队列中,因为不仅队列可能已满,而且可能还有线程被阻止等待发布到它.
归档时间: |
|
查看次数: |
2296 次 |
最近记录: |