Bonjour je pensais avec CompletableFuture et la valeur par défaut ForkJoinPool
je pourrais optimiser l'exécution de la tâche plus d'un classique ExecutorService
mais je manque quelque choseutilisation CompletableFuture sur ForkJoinpool et éviter thread en attente
Avec ce code l'exécution prend 1 seconde, je 3 threads de travail:
for (int i = 0; i < 3; i++) {
final int counter = i;
listTasks.add(CompletableFuture.supplyAsync(() -> {
Thread.sleep(1000);
System.out.println("Looking up " + counter + " on thread " + Thread.currentThread().getName());
return null;
}));
}
OK, semble normal.
Mais avec ce code, il faut 3 secondes:
for (int i = 0; i < 9; i++) {
final int counter = i;
listTasks.add(CompletableFuture.supplyAsync(() -> {
Thread.sleep(1000);
System.out.println("Looking up " + counter + " on thread " + Thread.currentThread().getName());
return null;
}));
}
Je pensais que le fil du sommeil serait utilisé pour lancer d'autres tâches en attente, il devrait aussi prend 1 seconde. J'ai lu par exemple que l'état de thread IO WAINTING signifierait que le thread peut être réutilisé pour une autre tâche. Puis-je tester ce comportement avec Thread.sleep()
? Ma méthode de test est-elle incorrecte ou ai-je mal compris quelque chose?
Combien de processeurs avez-vous sur votre ordinateur? –
Salut, 2 réels, mais j'ai mis cela pour forcer 3 travailleurs et éviter le thread de fonte: 'System.setProperty (" java.util.concurrent.ForkJoinPool.common.parallelism "," 3 ");' – bodtx