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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top