Java Language Recuperando valor de cómputo - Callable


Ejemplo

Si su cómputo produce algún valor de retorno que luego se requiere, una simple tarea Ejecutable no es suficiente. Para tales casos, puede usar ExecutorService.submit( Callable <T>) que devuelve un valor una vez que se completa la ejecución.

El Servicio devolverá un Future que puede utilizar para recuperar el resultado de la ejecución de la tarea.

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

Cuando necesite obtener el resultado del futuro, llame a future.get()

  • Espera indefinidamente a que el futuro termine con un resultado.

      try {
          // Blocks current thread until future is completed
          Integer result = future.get(); 
      catch (InterruptedException || ExecutionException e) {
          // handle appropriately
      }
    
  • Espere a que el futuro termine, pero no más de lo especificado.

      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 ya no es necesario el resultado de una tarea programada o en ejecución, puede llamar a Future.cancel(boolean) para cancelarla.

  • Llamar a cancel(false) solo eliminará la tarea de la cola de tareas que se ejecutarán.
  • Llamar a cancel(true) también interrumpirá la tarea si se está ejecutando actualmente.