Вы ссылаетесь на комментарий в JavaDoc :
Далее, поведение этой операции не определено, если указанная коллекция
изменяется во время выполнения операции.
Я считаю, что это относится к коллекции list
в вашем примере:
blockingQueue.drainTo(list);
означает, что вы не можете изменить list
в то же время, когда вы сливаете из blockingQueue
в list
. Однако очередь блокировки внутренне синхронизируется, поэтому, когда вызывается drainTo
, ставится и блокируется (см. Примечание ниже). Если бы он этого не делал, то он не был бы действительно поточно-ориентированным. Вы можете взглянуть на исходный код и убедиться, что drainTo
является поточно-ориентированным в отношении самой очереди блокировки.
Альтернативно, вы имеете в виду, что когда вы вызываете drainTo
, вы хотите, чтобы он блокировался, пока хотя бы один объект не был добавлен в очередь? В этом случае у вас мало выбора, кроме:
list.add(blockingQueue.take());
blockingQueue.drainTo(list);
блокировать до тех пор, пока не будет добавлен один или несколько элементов, а затем слить всю очередь в коллекцию list
.
Примечание. Начиная с Java 7, для получения и размещения используется отдельная блокировка. Операции «пут» теперь разрешены во время «слива» (и ряда других операций «бери»).