code: public int drainTo(Collection<? super E> c) {
      int result = buffer.drainTo(c);
      if (producer != null) {
        producer.wakeUp();
      }
  
      return result;
    }
docs: 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.
  A failure encountered while attempting to add elements to collection c may result in elements being in neither,
  either or both collections when the associated exception is thrown. Attempts to drain a queue to itself result in IllegalArgumentException.
  Further, the behavior of this operation is undefined if the specified collection is modified while the operation is in progress.
  
  @return the number of elements transferred