Question

J'ai actuellement un code qui effectue les opérations suivantes:

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

Le problème que je vais avoir est que je reçois chacun la tâche future d'imprimer le temps qu'ils prennent lorsque vous faites le calcul, donc par exemple sur la console que je verrai

first_task : 20000ms
second_task : 18000ms
...

mais le temps total (System.out.println(time taken)) est beaucoup plus grande que la plus longue prise par une tâche future, donc en ligne avec cet exemple, la méthode ne prendrait environ 1 minute (par rapport aux années 20 first_task).

J'avais l'impression que ces tâches futures exécutées en parallèle, mais des timings il semble que si elles sont en cours d'exécution un après l'autre. Suis-je utiliser cette API correctement?

Était-ce utile?

La solution

Vous utilisez correctement l'API, mais gardez à l'esprit que chaque tâche est exécutée dans un thread séparé, et non pas un processus séparé (et donc pas nécessairement en parallèle).

Chaque fil devrait fonctionner sur un noyau CPU séparé pour exécuter effectivement en même temps. Si oui ou non cela est possible dépend de votre machine, sa charge actuelle et comment la machine virtuelle Java et OS sont en mesure de planifier les discussions sur les noyaux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top