/**
   * Defines a {@link TaskScheduler} to run on all subsequently submitted jobs with the given tag.
   *
   * <p>Maximum of one allowed currently. Resubmissions of the same scheduler (or scheduler class)
   * allowed. If changing, you must call {@link #clearTaskSchedulerForTag(Object)} between the two.
   *
   * @see #setTaskSchedulerForTag(Object, Class)
   */
  public void setTaskSchedulerForTag(Object tag, TaskScheduler scheduler) {
    synchronized (schedulerByTag) {
      scheduler.injectExecutor(runner);

      Object old = schedulerByTag.put(tag, scheduler);
      if (old != null && old != scheduler) {
        // might support multiple in future...
        throw new IllegalStateException(
            "Not allowed to set multiple TaskSchedulers on ExecutionManager tag (tag " + tag + ")");
      }
    }
  }