我有一个非常简单的代码片段:
public static void main(String [] args) throws InterruptedException { TransferQueue<Integer> transferQueue = new LinkedTransferQueue<>(); System.out.println("Step1"); transferQueue.put(2); System.out.println("Step2"); transferQueue.transfer(2); System.out.println("Step3"); }
运行此程序,它将打印:
Step1 Step2
然后挂在那里。为什么“transfer()”函数不起作用?
这是由 javadoc 对于 transfer(e) 方法。
transfer(e)
更准确地说,如果存在等待接收指定元素的使用者(在 take() 或定时轮询),否则将在该队列的尾部插入指定的元素 等待直到消费者收到元素 .
take()
强调添加!
在您的示例中,没有消费者可以接收元素,因此 transfer(2) 永远阻止通话。
transfer(2)
(这与前面无关 put(2) 打电话)
put(2)