code: public QueueTracer<?> takeTracer() {
      this.queueReadLock.lock();
      try {
        QueueTracer<?> tracer;
        if (this.queueConfig.enabled) {
          try {
            tracer = this.queueConfig.blockingTracerDeque.takeFirst();
  //          this.queueConfig.tracerMap.put(Thread.currentThread(), tracer);
            this.queueConfig.currentTracer.set(tracer);
          }
          catch (InterruptedException ex) {
            System.err.printf("Interrupted when waiting for a QueueTracer... %n");
            tracer = this.queueConfig.queueNullTracer;
          }
        }
        else {
          tracer = this.queueConfig.queueNullTracer;
        }
  
        return tracer;
      }
      finally {
        this.queueReadLock.unlock();
      }
    }
docs: Takes the tracer from the head of the deque. If the deque is empty the methods blocks until a tracer will become available. By default a
  QueueTracer wrapping a NullTracer will be (non-blocking) delivered.
  @return the tracer from the head of the deque