Maison > Java > javaDidacticiel > Comment puis-je utiliser des pools de threads personnalisés avec des flux parallèles Java 8 ?

Comment puis-je utiliser des pools de threads personnalisés avec des flux parallèles Java 8 ?

Linda Hamilton
Libérer: 2024-12-24 17:42:18
original
188 Les gens l'ont consulté

How Can I Use Custom Thread Pools with Java 8 Parallel Streams?

Pools de threads personnalisables dans Java 8 Flux parallèles

Le contrôle de l'allocation des ressources de thread au sein des flux parallèles améliore les performances et la modularité des applications. Cependant, on ne sait toujours pas comment désigner des pools de threads personnalisés pour des opérations de flux spécifiques dans Java 8.

Cet article explore le problème et propose une solution, surmontant la limitation des pools de threads partagés dans les flux parallèles.

Énoncé du problème

Considérez une application serveur utilisant des flux parallèles. Pour éviter que les tâches lentes au sein d'un module n'aient un impact sur les autres, une compartimentation du pool de threads est souhaitée. Cependant, l'implémentation standard du flux parallèle utilise un pool de threads partagé pour toutes les opérations.

Comme l'illustre l'extrait de code suivant, une tâche compromise retarde indéfiniment les autres threads :

// CPU-intensive tasks in separate threads leveraging parallel streams
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));
Copier après la connexion

Solution

Pour exécuter des opérations parallèles au sein d'un pool de jointure fork désigné, utilisez-le comme tâche au sein du piscine. Cela isole l'opération du pool partagé :

final int parallelism = 4;
ForkJoinPool forkJoinPool = null;
try {
    forkJoinPool = new ForkJoinPool(parallelism);
    final List<Integer> primes = forkJoinPool.submit(() -> {
        // Parallel task here, for example:
        return IntStream.range(1, 1_000_000).parallel()
                .filter(PrimesPrint::isPrime)
                .boxed()
                .collect(Collectors.toList());
    }).get();
    System.out.println(primes);
} catch (Exception e) {
    throw new RuntimeException(e);
} finally {
    if (forkJoinPool != null) {
        forkJoinPool.shutdown();
    }
}
Copier après la connexion

Cette technique exploite le comportement de ForkJoinTask.fork() : "Exécutez de manière asynchrone cette tâche dans le pool dans lequel la tâche actuelle s'exécute, le cas échéant, ou en utilisant le ForkJoinPool.commonPool() s'il n'est pas dans ForkJoinPool()."

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal