code: public void blockingRun(final Task<?> task, final String planClass) {
      try {
        acquirePermit(planClass);
        runWithPermit(task, planClass);
      } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
      }
    }
docs: Runs the given task. Task passed in as a parameter becomes a root on a new Plan.
  All tasks created and started as a consequence of a root task will belong to that plan and will share a Trace.
  <p>
  This method blocks until Engine has a capacity to run the task. Engine's capacity is
  specified by a {@value #MAX_CONCURRENT_PLANS} configuration property. Use
  {@link EngineBuilder#setEngineProperty(String, Object)} to set this property.
  For the sake of backwards compatibility default value for a {@value #MAX_CONCURRENT_PLANS} is
  {@value #DEFUALT_MAX_CONCURRENT_PLANS} which essentially means "unbounded capacity".
  
  @param task the task to run
  @param planClass string that identifies a "class" of the Plan. Plan class ends up in a ParSeq
  Trace and can be used to group traces into "classes" when traces are statistically analyzed.