Java Language Recupero del valore dal calcolo - Callable

Esempio

Se il tuo calcolo produce un valore di ritorno che in seguito è richiesto, una semplice attività Runnable non è sufficiente. Per tali casi è possibile utilizzare ExecutorService.submit( Callable <T>) che restituisce un valore al termine dell'esecuzione.

Il servizio restituirà un Future che è possibile utilizzare per recuperare il risultato dell'esecuzione dell'attività.

// Submit a callable for execution
ExecutorService pool = anExecutorService;
Future<Integer> future = pool.submit(new Callable<Integer>() {
    @Override public Integer call() {
        //do some computation
        return new Random().nextInt();
    }
});    
// ... perform other tasks while future is executed in a different thread

Quando hai bisogno di ottenere il risultato del futuro, chiama future.get()

  • Aspetta indefinitamente che il futuro finisca con un risultato.

      try {
          // Blocks current thread until future is completed
          Integer result = future.get(); 
      catch (InterruptedException || ExecutionException e) {
          // handle appropriately
      }
    
  • Aspetta che il futuro finisca, ma non più del tempo specificato.

      try {
          // Blocks current thread for a maximum of 500 milliseconds.
          // If the future finishes before that, result is returned,
          // otherwise TimeoutException is thrown.
          Integer result = future.get(500, TimeUnit.MILLISECONDS); 
      catch (InterruptedException || ExecutionException || TimeoutException e) {
          // handle appropriately
      }
    

Se il risultato di un'attività pianificata o in esecuzione non è più necessario, puoi chiamare Future.cancel(boolean) per cancellarlo.

  • Calling cancel(false) rimuove l'attività dalla coda delle attività da eseguire.
  • La chiamata cancel(true) interromperà anche l'attività se è attualmente in esecuzione.