Java LinkedBlockingQueue上的add()是否通知等待的线程?
我有一个消费者线程从Java LinkedBlockingQueue上的add()是否通知等待的线程?,java,multithreading,locking,queue,Java,Multithreading,Locking,Queue,我有一个消费者线程从LinkedBlockingQueue中获取元素,当它为空时,我手动使其休眠。我使用peek()查看队列是否为空,因为我必须在发送线程进入睡眠状态之前执行一些操作,我使用queue.wait()来执行此操作 因此,当我在另一个线程中,并且add()将一个元素添加到队列中时,这会自动通知队列中正在wait()的线程吗?是的。或者更确切地说,它使用更有效的内部锁对象,而不是外部队列对象的锁;如果您想一直睡到队列中有东西到达,请执行阻塞take()。(如果您在等待时还有其他事情要
LinkedBlockingQueue
中获取元素,当它为空时,我手动使其休眠。我使用peek()
查看队列是否为空,因为我必须在发送线程进入睡眠状态之前执行一些操作,我使用queue.wait()
来执行此操作
因此,当我在另一个线程中,并且
add()
将一个元素添加到队列中时,这会自动通知队列中正在wait()
的线程吗?是的。或者更确切地说,它使用更有效的内部锁对象,而不是外部队列对象的锁;如果您想一直睡到队列中有东西到达,请执行阻塞take()
。(如果您在等待时还有其他事情要做,考虑阻塞队列是否是从其他地方接收消息的正确方式。)/P>内部实际上有两个锁,一个处理队列空箱的通知,另一个是队列完整的情况。它们是私有的——有充分的理由——所以使用API,因为它应该被使用。