/**
  * Insert the specified {@link QueueElement} element into the queue.
  *
  * @param queueElement the {@link QueueElement} element to add.
  * @param ignoreSize if the queue is bound to a maximum size and the maximum size is reached, this
  *     parameter (if set to <tt>true</tt>) allows to ignore the maximum size and add the element
  *     to the queue.
  * @return <tt>true</tt> if the element has been inserted, <tt>false</tt> if the element was not
  *     inserted (the queue has reached its maximum size).
  * @throws NullPointerException if the specified element is null
  */
 boolean offer(QueueElement<E> queueElement, boolean ignoreSize) {
   if (queueElement == null) {
     throw new NullPointerException("queueElement is NULL");
   }
   if (queueElement.getPriority() < 0 || queueElement.getPriority() >= priorities) {
     throw new IllegalArgumentException("priority out of range: " + queueElement);
   }
   if (queueElement.inQueue) {
     throw new IllegalStateException("queueElement already in a queue: " + queueElement);
   }
   if (!ignoreSize && currentSize != null && currentSize.get() >= maxSize) {
     return false;
   }
   boolean accepted;
   lock.lock();
   try {
     accepted = queues[queueElement.getPriority()].offer(queueElement);
     debug(
         "offer([{0}]), to P[{1}] delay[{2}ms] accepted[{3}]",
         queueElement.getElement().toString(),
         queueElement.getPriority(),
         queueElement.getDelay(TimeUnit.MILLISECONDS),
         accepted);
     if (accepted) {
       if (currentSize != null) {
         currentSize.incrementAndGet();
       }
       queueElement.inQueue = true;
     }
   } finally {
     lock.unlock();
   }
   return accepted;
 }
 /**
  * Retrieve and remove the head of this queue, or return <tt>null</tt> if this queue has no
  * elements with an expired delay.
  *
  * <p>The retrieved element is the oldest one from the highest priority sub-queue.
  *
  * <p>Invocations to this method run the anti-starvation (once every interval check).
  *
  * @return the head of this queue, or <tt>null</tt> if this queue has no elements with an expired
  *     delay.
  */
 @Override
 public QueueElement<E> poll() {
   lock.lock();
   try {
     antiStarvation();
     QueueElement<E> e = null;
     int i = priorities;
     for (; e == null && i > 0; i--) {
       e = queues[i - 1].poll();
     }
     if (e != null) {
       if (currentSize != null) {
         currentSize.decrementAndGet();
       }
       e.inQueue = false;
       debug("poll(): [{0}], from P[{1}]", e.getElement().toString(), i);
     }
     return e;
   } finally {
     lock.unlock();
   }
 }