Future y Callable

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();

}

}

Respuesta

  1. […] Para paralelizarlo en Java tendría que crearme una clase que implemente el interfaz Callable (ver post Future y Callable) […]

Deja un comentario