Документация BlockingQueue говорит, что массовые операции не являются потокобезопасными, хотя в нем явно не упоминается метод drainTo().
Реализация BlockingQueue потокобезопасный. Все методы очередей достигают своих эффектов, используя атомы внутренние замки или другие формы concurrency. Однако основная масса Коллекционные операции addAll, containsAll, убрать all и removeAll не обязательно выполняются если не указано иное в реализации. Так что, это возможно, например, для addAll (c) сбой (сброс исключения) после добавление только некоторых элементов в c.
Документация метода drainTo() указывает, что сбор, к которому сливаются элементы BlockingQueue, не может быть изменен поточно-безопасным способом. Но в нем ничего не говорится о том, что операция denTo() является потокобезопасной.
Удаляет все доступные элементы из эту очередь и добавляет их к данному коллекция. Эта операция может быть больше эффективнее, чем многократно очередь. Ошибка, с которой попытка добавить элементы к сбор c может привести к появлению элементов ни в одном, ни в обоих коллекции, когда ассоциированные исключение. Попытки слить очередь к себе приводит к IllegalArgumentException. Кроме того, поведение этой операции undefined, если указанная коллекция изменяется во время работы прогресс.
Итак, метод threadTo() является поточно-безопасным? Другими словами, если один поток вызвал метод drainTo() в очереди блокировки, а другой вызвал add() или put() в той же очереди, состояние очереди согласовано в конце обеих операций?