Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LinkedBlockingQueue上的add()是否通知等待的线程?_Java_Multithreading_Locking_Queue - Fatal编程技术网

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,因为它应该被使用。