docs: @Override
      public void handleRequest(HttpServerExchange exchange) throws Exception {
  
          // Save the thread/runnable
          // Keeping a reference to the thread object here does not prevent
          // GC'ing, as the reference is removed from the Map in the finally clause
  
          Long key = Thread.currentThread().getId();
          MonitoredThread monitoredThread = new MonitoredThread(Thread.currentThread(), exchange.getRequestURI() + exchange.getQueryString());
          activeThreads.put(key, monitoredThread);
          if(timerKey == null) {
              synchronized (this) {
                  if(timerKey == null) {
                      timerKey = exchange.getIoThread().executeAfter(stuckThreadTask, 1, TimeUnit.SECONDS);
                  }
              }
          }
  
          try {
              next.handleRequest(exchange);
          } finally {
              activeThreads.remove(key);
              if (monitoredThread.markAsDone() == MonitoredThreadState.STUCK) {
                  completedStuckThreadsQueue.add(
                          new CompletedStuckThread(monitoredThread.getThread(),
                              monitoredThread.getActiveTimeInMillis()));
              }
          }
      }