2010-06-06 57 views
1

我有一个消费者线程,采用LinkedBlockingQueue中的元素,并在空闲时手动进行休眠。我使用peek()来查看队列是否为空,因为在发送线程进入睡眠之前我必须做些什么,并且我使用queue.wait()来做到这一点。LinkedBlockingQueue上的add()是否通知等待线程?


所以,当我在另一个线程和add()队列的元素是,是否自动通知,这是wait()荷兰国际集团在队列中的线程?

回答

2

是的。或者说,它确实使用了更高效的内部锁定对象,而不是外部队列对象的锁定;如果你想睡觉,直到某些东西到达队列中,请阻止take()。 (如果在等待时还有其他事情要做,请考虑阻塞队列是否是从其他地方接收消息的正确方式。)

+0

它实际上在内部具有两个锁,一个处理队列空情况的通知,另一个处理队列满的情况。他们是'私人的' - 有很好的理由 - 所以使用API​​是为了使用它。 – 2010-06-07 00:08:55