Est-il possible de préciser la personnalisation d'un pool de threads de Java 8 courant parallèle? Je ne peux pas le trouver n'importe où.
Imaginez que j'ai un serveur d'application, et je voudrais utiliser les flux parallèles. Mais la demande est grande et multi-thread, donc, je tiens à compartimenter. Je ne veux pas d'un lent en cours d'exécution de la tâche dans un module de la applicationblock des tâches à partir d'un autre module.
Si je ne peux pas utiliser les différents pools de threads pour les différents modules, cela signifie que je ne peux pas l'utiliser en toute sécurité des flux parallèles dans la plupart des situations du monde réel.
Essayez l'exemple suivant. Il y a quelques temps CPU des tâches exécutées dans des threads séparés. Les tâches de l'effet de levier flux parallèles. La première tâche est rompu, de sorte que chaque étape prend 1 seconde (simulé par un fil de sommeil). Le problème est que les autres threads coincé et d'attendre le cassé de la tâche à terminer. C'est l'exemple artificiel, mais imaginez un servlet application et quelqu'un de la soumission d'une longue tâche en cours d'exécution à la fourche de rejoindre la piscine.
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);
}
}