code: public final void collect ()
    {
      if (m_aPerformer == null)
        throw new IllegalStateException ("No performer set!");
  
      try
      {
        // The temporary list that contains all objects to be delivered
        while (true)
        {
          // Block until the first object is in the queue
          final Object aCurrentObject = m_aQueue.take ();
          if (aCurrentObject == STOP_QUEUE_OBJECT)
            break;
  
          _perform (GenericReflection.uncheckedCast (aCurrentObject));
        }
      }
      catch (final Exception ex)
      {
        LOGGER.error ("Error taking elements from queue - queue has been interrupted!!!", ex);
      }
    }
docs: This method starts the collector by taking objects from the internal
  {@link BlockingQueue}. So this method blocks and must be invoked from a
  separate thread. This method runs until {@link #stopQueuingNewObjects()} is
  new called and the queue is empty.
  
  @throws IllegalStateException
  if no performer is set - see
  {@link #setPerformer(IConcurrentPerformer)}