docs: public void waitAndStopThreads()
      {
          try
          {
              if (threadMap.isEmpty())
              {
                  throw new IllegalStateException("threads are already interrupted");
              }
              stopSemaphore.acquire(maxParallelism);
              stopThreads();
          }
          catch (InterruptedException ex)
          {
              throw new IllegalArgumentException(ex);
          }
      }