0Pricing
Java Academy · Leçon

Créer des flux parallèles

parallel() et parallelStream()

Créer des flux parallèles est une leçon Java Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Java Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Java Academy comprend 4 leçons au total.

Fonctionnement des flux parallel

Un flux parallèle divise ses données et traite les blocs sur plusieurs fils d’exécution, puis combine les résultats. L’objectif est d’obtenir un débit supérieur pour les charges de travail importantes.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int sum = IntStream.rangeClosed(1, 1000)
            .parallel()
            .sum();
        System.out.println(sum);
    }
}

parallel() sur un flux existant

L’appel de parallel() transforme un flux séquentiel en flux parallel. Il peut apparaître n’importe où dans le pipeline.

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> nums = List.of(1, 2, 3, 4, 5);
        int total = nums.stream()
            .parallel()
            .mapToInt(Integer::intValue)
            .sum();
        System.out.println(total);
    }
}

parallelStream() sur les collections

Collection.parallelStream() crée directement un flux parallel, ce qui constitue un raccourci par rapport à stream().parallel().

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> words = List.of("a", "bb", "ccc");
        int chars = words.parallelStream()
            .mapToInt(String::length)
            .sum();
        System.out.println(chars);
    }
}

Revenir au mode séquentiel

sequential() rétablit l’exécution sur un seul fil. Le dernier appel à parallel() ou sequential() l’emporte pour l’ensemble du pipeline.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int sum = IntStream.rangeClosed(1, 100)
            .parallel()
            .sequential()
            .sum();
        System.out.println(sum);
    }
}

Vérifier isParallel

isParallel() indique si un flux s’exécutera en parallel.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        System.out.println(IntStream.range(0, 10).isParallel());
        System.out.println(IntStream.range(0, 10).parallel().isParallel());
    }
}

Même résultat, exécution différente

Pour les opérations associatives comme la somme, les flux parallel et séquentiels renvoient le même résultat. Seule la stratégie d’exécution diffère.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int seq = IntStream.rangeClosed(1, 50).sum();
        int par = IntStream.rangeClosed(1, 50).parallel().sum();
        System.out.println(seq == par);
    }
}

Le ForkJoinPool commun

Les flux parallel utilisent le ForkJoinPool.commonPool() partagé. Sa taille par défaut correspond au nombre de processeurs disponibles moins un.

public class Main {
    public static void main(String[] args) {
        System.out.println(Runtime.getRuntime().availableProcessors());
    }
}

L’ordre des fils d’exécution n’est pas garanti

Avec forEach, les flux parallel peuvent afficher les résultats dans n’importe quel ordre, car les blocs se terminent à des moments différents. Utilisez forEachOrdered si l’ordre est important.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        IntStream.rangeClosed(1, 5)
            .parallel()
            .forEachOrdered(System.out::println);
    }
}

La réduction combine les résultats partiels

En interne, une réduction parallèle calcule des résultats partiels pour chaque bloc et les fusionne avec le combinateur. L’opération doit être associative pour être correcte.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int product = IntStream.rangeClosed(1, 6)
            .parallel()
            .reduce(1, (a, b) -> a * b);
        System.out.println(product);
    }
}

Collecte en parallel

L’infrastructure des collecteurs prend en charge la collecte parallèle en fusionnant des conteneurs partiels. groupingBy fonctionne correctement en parallel.

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<String> words = List.of("apple", "banana", "avocado", "cherry");
        Map<Character, List<String>> byFirst = words.parallelStream()
            .collect(Collectors.groupingBy(w -> w.charAt(0)));
        System.out.println(byFirst);
    }
}

Tous les flux ne deviennent pas plus rapides

Activer le parallel est trivial, mais ce n’est pas toujours bénéfique. Les petits ensembles de données ou les opérations peu coûteuses peuvent être plus lents en parallel à cause du coût de division et de fusion.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        long count = IntStream.rangeClosed(1, 10)
            .parallel()
            .filter(n -> n % 2 == 0)
            .count();
        System.out.println(count);
    }
}

Vérification rapide

Quel groupe de fils d’exécution exécute par défaut les flux parallel ?

Récapitulatif

Vous avez créé des flux parallel :

  • parallel() convertit n’importe quel flux ; parallelStream() est un raccourci pour les collections.
  • sequential() rétablit le mode séquentiel ; le dernier appel l’emporte.
  • Ils s’exécutent dans le ForkJoinPool.commonPool() partagé.
  • Les résultats correspondent à ceux du mode séquentiel pour les opérations associatives, mais l’ordre et la vitesse ne sont pas garantis.

Questions Fréquemment Posées

La leçon « Créer des flux parallèles » est-elle gratuite ?

Oui — le texte complet de « Créer des flux parallèles » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Java Academy, passe à CoddyKit PRO. Le cours Java Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Créer des flux parallèles » ?

parallel() et parallelStream() Tu pratiques Java Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Java Academy ?

Aucune expérience préalable n'est requise. Java Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.

Combien de temps prend la leçon « Créer des flux parallèles » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Java Academy ?

Oui. Chaque leçon Java Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Créer des flux parallèles
  2. Quand le parallélisme est utile
  3. Sûreté vis-à-vis des threads et effets secondaires
  4. Pièges courants
← Retour à Java Academy