As always with that sort of question it is difficult to say without asking the author of the class himself. But we can make some educated guesses.
The javadoc states:
Removes all available elements from this queue and adds them to the given collection. This operation may be more efficient than repeatedly polling this queue.
So the underlying reason is probably for efficiency.
drainTo
is essentially equivalent (in a single threaded environment, for simplicity) to:
while ((e = queue.poll()) != null) collection.add(e);
With a blocking queue, each iteration is (most likely) going to acquire some lock and release it again, which is not optimal. If you look at the implementation in ArrayBlockingQueue
for example, you will see that the lock is acquired once for the whole iteration, probably because the authors of the library found that it was more efficient.