Est-il possible de spécifier un pool de threads personnalisé pour le flux parallèle Java 8 ? Je ne peux pas le trouver nulle part.
Imaginez que j'ai une application serveur et que j'aimerais utiliser des flux parallèles. Mais l'application est grande et multithread donc je veux la compartimenter. Je ne veux pas d'une tâche d'exécution lente dans un module des tâches de blocage d'application d'un autre module.
Si je ne peux pas utiliser différents pools de threads pour différents modules, cela signifie que je ne peux pas utiliser en toute sécurité des flux parallèles dans la plupart des situations du monde réel.
Essayez l'exemple suivant. Certaines tâches gourmandes en CPU sont exécutées dans des threads séparés. Les tâches exploitent des flux parallèles. La première tâche est interrompue, chaque étape dure donc 1 seconde (simulée par le sommeil du thread). Le problème est que d'autres threads se bloquent et attendent que la tâche interrompue se termine. C'est un exemple artificiel, mais imaginez une application de servlet et quelqu'un soumettant une tâche de longue durée au pool de jointure de fourches partagé.
public class ParallelTest {
public static void main(String[] args) throws InterruptedException {
ExecutorService es = Executors.newCachedThreadPool();
es.execute(() -> runTask(1000)); //incorrect task
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.shutdown();
es.awaitTermination(60, TimeUnit.SECONDS);
}
private static void runTask(int delay) {
range(1, 1_000_000).parallel().filter(ParallelTest::isPrime).peek(i -> Utils.sleep(delay)).max()
.ifPresent(max -> System.out.println(Thread.currentThread() + " " + max));
}
public static boolean isPrime(long n) {
return n > 1 && rangeClosed(2, (long) sqrt(n)).noneMatch(divisor -> n % divisor == 0);
}
}