Package org.optaplanner.core.api.solver

## Interface SolverJob<Solution_,​ProblemId_>

- Type Parameters:
    `Solution_` - the solution type, the class with the `PlanningSolution` annotation
    `ProblemId_` - the ID type of a submitted problem, such as `Long` or `UUID`.
  All Known Implementing Classes:
    `DefaultSolverJob`

      public interface SolverJob<Solution_,​ProblemId_>

  Represents a `problem` that has been submitted to solve on the `SolverManager`.

- - ### Method Summary

    All Methods Instance Methods Abstract Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `Solution_` | `getFinalBestSolution()` | Waits if necessary for the solver to complete and then returns the final best `PlanningSolution`.
    `ProblemId_` | `getProblemId()` |
    `SolverStatus` | `getSolverStatus()` | Returns whether the `Solver` is scheduled to solve, actively solving or not.
    `Duration` | `getSolvingDuration()` | Returns the `Duration` spent solving since the last start.
    `void` | `terminateEarly()` | Terminates the solver or cancels the solver job if it hasn't (re)started yet.

- - ### Method Detail

    - #### getProblemId

          ProblemId_ getProblemId()

      Returns:
        never null, a value given to `SolverManager.solve(Object, Function, Consumer)` or `SolverManager.solveAndListen(Object, Function, Consumer)`

    - #### getSolverStatus

          SolverStatus getSolverStatus()

      Returns whether the `Solver` is scheduled to solve, actively solving or not.

      Returns `SolverStatus.NOT_SOLVING` if the solver already terminated.

      Returns:
        never null

    - #### terminateEarly

          void terminateEarly()

      Terminates the solver or cancels the solver job if it hasn't (re)started yet.

      Does nothing if the solver already terminated.

      Waits for the termination or cancellation to complete before returning. During termination, a `bestSolutionConsumer` could still be called (on a consumer thread), before this method returns.

    - #### getFinalBestSolution

          Solution_ getFinalBestSolution()
                                  throws InterruptedException,
                                         ExecutionException

      Waits if necessary for the solver to complete and then returns the final best `PlanningSolution`.
      Returns:
        never null, but it could be the original uninitialized problem
      Throws:
        `InterruptedException` - if the current thread was interrupted while waiting
        `ExecutionException` - if the computation threw an exception

    - #### getSolvingDuration

          Duration getSolvingDuration()

      Returns the `Duration` spent solving since the last start. If it hasn't started it yet, it returns `Duration.ZERO`. If it hasn't ended yet, it returns the time between the last start and now. If it has ended already, it returns the time between the last start and the ending.
      Returns:
        the `Duration` spent solving since the last (re)start, at least 0