2010-03-17 10 views
6

Este es un código de muestra de example. Lo que necesito saber es cuándo se llama al call() en el llamante? ¿Qué lo desencadena?¿Cuándo se llama al método call() en un ejecutante Java utilizando objetos invocables?

public class CallableExample { 

public static class WordLengthCallable 
    implements Callable { 
    private String word; 
    public WordLengthCallable(String word) { 
     this.word = word; 
    } 
    public Integer call() { 
     return Integer.valueOf(word.length()); 
    } 
} 

public static void main(String args[]) throws Exception { 
    ExecutorService pool = Executors.newFixedThreadPool(3); 
    Set<Future<Integer>> set = new HashSet<Future<Integer>>(); 
    for (String word: args) { 
     Callable<Integer> callable = new WordLengthCallable(word); 
     Future<Integer> future = pool.submit(callable); //**DOES THIS CALL call()?** 
     set.add(future); 
    } 
    int sum = 0; 
    for (Future<Integer> future : set) { 
     sum += future.get();//**OR DOES THIS CALL call()?** 
    } 
    System.out.printf("The sum of lengths is %s%n", sum); 
    System.exit(sum); 
    } 
} 

Respuesta

9

Una vez que tenga la submitted exigible, el ejecutor programará la exigible para su ejecución. Dependiendo del ejecutor esto podría suceder directamente o una vez que un hilo esté disponible.

Por otra parte, la llamada get solo espera a recuperar el resultado del cálculo.

Así que para ser precisos: En algún lugar entre submit llamando y la llamada a get regresando, se llama al invocable.

3

Toda la idea de utilizar un Executor es que no debe importar cuando exactamente se llama al método.

Lo único que se garantiza en general es que el método se habrá ejecutado cuando get() del Future regrese.

Cuando exactamente se llamará depende de qué Executor utilice. Con el grupo de subprocesos fijos que utiliza en el ejemplo, se llamará al método call() tan pronto como haya un hilo libre y no haya otra tarea delante de la tarea determinada en la cola (de modo que, mientras haya suficientes tareas, Tendrá 3 llamadas al método call() ejecutándose en cualquier momento en su ejemplo).

+0

entiendo la cuestión acerca de temas que estén disponibles en un momento impredecible, debería haber se le preguntó '¿cuándo se programará ** una llamada' **? - siempre que se programe en * submit() * entonces eso es todo lo que necesitaba saber :) – MalcomTucker

+0

@Malcom: No creo que eso sea mejor pregunta, dado que la programación no es visible/observable para el programa, entonces, ¿qué cambiaría si se programara más adelante? –

0

La respuesta a "¿Cuándo va a ser exigible horarios" se encuentra en java.util.concurrent.ThreadPoolExecutor # ejecutar la aplicación (por defecto)

Cuestiones relacionadas