code: public void iterate() {
          boolean process = false;
  
          loop:
          while (true) {
              try (Locker.Lock lock = _locker.lock()) {
                  switch (_state) {
                      case PENDING:
                      case CALLED:
                          // process will be called when callback is handled
                          break loop;
  
                      case IDLE:
                          _state = State.PROCESSING;
                          process = true;
                          break loop;
  
                      case PROCESSING:
                          _iterate = true;
                          break loop;
  
                      case FAILED:
                      case SUCCEEDED:
                          break loop;
  
                      case CLOSED:
                      default:
                          throw new IllegalStateException(toString());
                  }
              }
          }
          if (process)
              processing();
      }
docs: This method must be invoked by applications to start the processing
  of sub tasks.  It can be called at any time by any thread, and it's
  contract is that when called, then the {@link #process()} method will
  be called during or soon after, either by the calling thread or by
  another thread.