Domanda

Al momento ho il codice che fa il seguente:

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);
}

Il problema che sto avendo è che ricevo ogni del compito futuro per stampare il tempo che impiegano quando si fa il calcolo, così per esempio sulla console vedrò

first_task : 20000ms
second_task : 18000ms
...

, ma il tempo totale (System.out.println(time taken)) è molto più grande quindi il più lungo tempo presa da qualsiasi compito futuro, quindi in linea con questo esempio il metodo non avrebbe preso circa 1 minuto (rispetto agli anni '20 di first_task).

Ho avuto l'impressione che questi compiti futuri corrono in parallelo, ma dai tempi sembra come se essi vengono eseguiti uno dopo l'altro. Sto usando correttamente questa API?

È stato utile?

Soluzione

Si sta utilizzando l'API in modo corretto, ma di tenere presente che ogni operazione viene eseguita in un thread separato, non un processo separato (e quindi non necessariamente in parallelo).

Ogni filo dovrebbe funzionare su un nucleo CPU separato per eseguire effettivamente allo stesso tempo. Se questo è possibile dipende dalla vostra macchina, il suo carico di corrente, e come la JVM e OS sono in grado di pianificare i fili attraverso core.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top