我有一个非常简单的代码段:

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()”函数不起作用?

最佳答案

transfer(e)方法的javadoc对此进行了解释。


  更准确地说,如果存在已经在等待接收它的使用者(在take()或定时轮询中),则立即传输指定的元素,否则将指定的元素插入此队列的末尾,并等待直到使用者接收到该元素。


重点补充!

在您的示例中,没有使用者可以接收该元素,因此transfer(2)调用将永远阻塞。

(这与前面的put(2)调用无关。)

08-05 21:05