Como o FutureTasks e CachedThreadpool funcionam
-
24-09-2019 - |
Pergunta
Atualmente, tenho código que faz o seguinte:
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);
}
O problema que estou tendo é que recebo cada tarefa futura para imprimir o tempo que eles levam ao fazer computação, por exemplo, no console, verei
first_task : 20000ms
second_task : 18000ms
...
Mas o tempo total (System.out.println(time taken)
) é muito maior do que o tempo mais longo, levada por qualquer tarefa futura; portanto, de acordo com este exemplo, o método levaria cerca de 1 minuto (em comparação com os 20s do First_Task).
Eu estava com a impressão de que essas tarefas futuras foram executadas em paralelo, mas dos horários parece que estão sendo executados um após o outro. Estou usando esta API corretamente?
Solução
Você está usando a API corretamente, mas lembre -se de que cada tarefa é executada em um encadeamento separado, não em um processo separado (e, portanto, não necessariamente em paralelo).
Cada encadeamento teria que ser executado em um núcleo de CPU separado para realmente executar ao mesmo tempo. Se isso é possível ou não, depende da sua máquina, da carga atual e de como a JVM e o sistema operacional podem agendar os threads nos núcleos.