Java Language Récupération de la valeur du calcul - Appelable


Exemple

Si votre calcul produit une valeur de retour qui est requise plus tard, une simple tâche Runnable ne suffit pas. Dans ce cas, vous pouvez utiliser ExecutorService.submit( Callable <T>) qui renvoie une valeur une fois l'exécution terminée.

Le service renverra un Future que vous pourrez utiliser pour récupérer le résultat de l'exécution de la tâche.

// 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

Lorsque vous avez besoin d'obtenir le résultat du futur, appelez future.get()

  • Attendez indéfiniment pour l'avenir pour finir avec un résultat.

      try {
          // Blocks current thread until future is completed
          Integer result = future.get(); 
      catch (InterruptedException || ExecutionException e) {
          // handle appropriately
      }
    
  • Attendez que l'avenir se termine, mais pas plus que le temps spécifié.

      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
      }
    

Si le résultat d'une tâche planifiée ou en cours d'exécution n'est plus requis, vous pouvez appeler Future.cancel(boolean) pour l'annuler.

  • L'appel de cancel(false) supprime simplement la tâche de la file d'attente des tâches à exécuter.
  • L'appel à cancel(true) interrompt également la tâche si elle est en cours d'exécution.