Estoy tratando de entender cómo un Callable
puede devolver un valor cuando se ejecuta en un hilo diferente.¿Cómo funciona una Llamada bajo el capó? ¿Cómo es posible que un objeto invocable devuelva un valor?
Busco en las clases Executors
, AbstractExecutorService
, ThreadPoolExecutor
y FutureTask
, todos disponibles en java.util.concurrent
paquete.
Crea un objeto ExecutorService llamando a un método en Ejecutores (por ejemplo, newSingleThreadExecutor()
). Luego puede pasar un objeto invocable con ExecutorService.submit(Callable c)
.
Dado que el método call()
se ejecuta mediante un subproceso proporcionado por el ExecutorService
, ¿dónde el objeto devuelto "salta" de nuevo al hilo de llamada?
Look en este ejemplo sencillo:
1 ExecutorService executor = Executors.newSingleThreadExecutor();
2 public static void main(String[] args) {
3 Integer i = executor.submit(new Callable<Integer>(){
4 public Integer call() throws Exception {
5 return 10;
6 }
7 }).get();
8 System.out.print("Returns: " + i + " Thread: " + Thread.currentThread.getName());
9 // prints "10 main"
10 }
¿Cómo es posible que el número entero en el método de llamada, que está dirigido por un hilo separado, se devuelve al objeto entero (fila 3) por lo que puede ser impreso por la declaración System.out
en el hilo principal (fila 7)?
¿No es posible ejecutar el hilo principal antes de que el ExecutorService
haya ejecutado su hilo, de modo que el System.out statement
imprime nulo?
Existen algunos errores de compilación en este código; por ejemplo, 'executor.submit' devuelve un futuro, no un entero, y' currentThread' es un método que debe invocarse. Si a alguien le interesa ver un ejemplo que funcione, consulte http://ideone.com/myoMB –
Disculpe, estaba escribiendo ese código a mano. :-) Echaré un vistazo a tu ejemplo. – Rox
Oh no hay problema, solo estaba tratando de ser útil. Es una buena pregunta. +1 –