Pregunta

Actualmente tengo código que hace lo siguiente:

private final static ExecutorService pool = Executors.newCachedThreadPool();
public void foo(){
    FutureTask<MyObject> first_task = createFutureTask();
    FutureTask<MyObject> second_task = createFutureTask();
    ...

    pool.execute(first_task);
    pool.execute(second_task);
    ....
    first_task.get();
    second_task.get();
    ...
    System.out.println(time taken);
}

El problema que estoy teniendo es que consigo cada uno de la tarea futura para imprimir el tiempo que toman cuando se hace el cálculo, así por ejemplo en la consola veré

first_task : 20000ms
second_task : 18000ms
...

pero el tiempo total (System.out.println(time taken)) es mucho más grande que el tiempo más largo adoptada por cualquier tarea futuro, por lo que de acuerdo con este ejemplo, el método no tomaría alrededor de 1 minuto (en comparación con los años 20 del first_task).

Yo tenía la impresión de que estas tareas futuras en paralelo pero a partir de los tiempos parece como si se ejecutan una tras otra. ¿Estoy usando esta API correctamente?

¿Fue útil?

Solución

Se utiliza el API correctamente, pero tener en cuenta que cada tarea se ejecuta en un hilo separado, no es un proceso separado (y por lo tanto no necesariamente en paralelo).

Cada hilo tendría que funcionar con un núcleo de CPU para ejecutar separada de hecho al mismo tiempo. Sea o no esto es posible depende de su máquina, su carga actual, y cómo la JVM y OS son capaces de programar los hilos a través de núcleos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top