Complementando el post Threads: Devolver valores desde un Hilo volvemos al tema de los Callables y el interfaz Future.
Al trabajar con hilos en Java tenemos el interfaz Runnable. El Runnable en Java no devuelven valores:
Si necesito que mi hilo devuelva valores al proceso que lo invoca tengo que usar Callable que permite devolver valores después de que se haya completado su ejecución.
Cuando metamos los Callables en el Executor
este devolverá un java.util.concurrent.Future, que permite comprobar el estado de un Callable y obtener el resultado de este:
El ejemplo completo sería este:
MyCallable:
| import java.util.concurrent.Callable;
public class MyCallable implements Callable<Long> { @Override public Long call() throws Exception { long sum = 0; for (long i = 0; i <= 100; i++) { sum += i; } return sum; } } |
CallableFutures:
| import java.util.ArrayList;
import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class CallableFutures { private static final int NTHREDS = 10; public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(NTHREDS); List<Future<Long>> list = new ArrayList<Future<Long>>(); for (int i = 0; i < 20000; i++) { Callable<Long> worker = new MyCallable(); Future<Long> submit = executor.submit(worker); list.add(submit); } long sum = 0; System.out.println(list.size()); // Now retrieve the result for (Future<Long> future : list) { try { sum += future.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } System.out.println(sum); executor.shutdown(); } } |




Replica a Spring: Paralelizar invocaciones con @Async | Un poco de Java Cancelar la respuesta