optaplanner-core/src/main/java/org/optaplanner/core/impl/heuristic/thread/OrderByMoveIndexBlockingQueue.java
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);
            }
        }
    }
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);
            }
        }
    }
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 ) ; } } }
Not thread-safe. Can only be called from the solver thread.
@return never null
@throws InterruptedException if interrupted
@see BlockingQueue#take()
Not thread - safe . Can only be called from the solver thread .