Почему java TransferQueue не может "передать ()" после "положить ()"? - PullRequest
0 голосов
/ 08 января 2019

У меня есть очень простой фрагмент кода:

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 ()"?

1 Ответ

0 голосов
/ 08 января 2019

Это объясняется javadoc для метода transfer(e).

Точнее, передает указанный элемент немедленно, если существует потребитель, уже ожидающий его получения (в take() или таймерном опросе), иначе вставляет указанный элемент в конец этой очереди и ждет, пока элемент получено потребителем .

Акцент добавлен!

В вашем примере нет получателя, который бы получил элемент, поэтому transfer(2) вызов блокируется навсегда.

(Это не имеет ничего общего с предыдущим put(2) вызовом.)

...