code: public void startNextStep(int stepIndex) {
          synchronized (this) {
              if (filterStepIndex >= stepIndex) {
                  throw new IllegalStateException("The old filterStepIndex (" + filterStepIndex
                          + ") must be less than the stepIndex (" + stepIndex + ")");
              }
              filterStepIndex = stepIndex;
              MoveResult<Solution_> exceptionResult = innerQueue.stream().filter(MoveResult::hasThrownException)
                      .findFirst().orElse(null);
              if (exceptionResult != null) {
                  throw new IllegalStateException("The move thread with moveThreadIndex ("
                          + exceptionResult.getMoveThreadIndex() + ") has thrown an exception."
                          + " Relayed here in the parent thread.",
                          exceptionResult.getThrowable());
              }
              innerQueue.clear();
          }
          nextMoveIndex = 0;
          backlog.clear();
      }
docs: Not thread-safe. Can only be called from the solver thread.
  @param stepIndex at least 0