code: public MoveResult<Solution_> take() throws InterruptedException {
          int moveIndex = nextMoveIndex;
          nextMoveIndex++;
          if (!backlog.isEmpty()) {
              MoveResult<Solution_> result = backlog.remove(moveIndex);
              if (result != null) {
                  return result;
              }
          }
          while (true) {
              MoveResult<Solution_> result = innerQueue.take();
              // If 2 exceptions are added from different threads concurrently, either one could end up first.
              // This is a known deviation from 100% reproducibility, that never occurs in a success scenario.
              if (result.hasThrownException()) {
                  throw new IllegalStateException("The move thread with moveThreadIndex ("
                          + result.getMoveThreadIndex() + ") has thrown an exception."
                          + " Relayed here in the parent thread.",
                          result.getThrowable());
              }
              if (result.getMoveIndex() == moveIndex) {
                  return result;
              } else {
                  backlog.put(result.getMoveIndex(), result);
              }
          }
      }
docs: Not thread-safe. Can only be called from the solver thread.
  @return never null
  @throws InterruptedException if interrupted
  @see BlockingQueue#take()