web-dev-qa-db-fra.com

Différence entre Java 8 flux et flux parallèles

J'ai écrit du code en utilisant Java 8 flux et flux parallèles pour la même fonctionnalité avec un collecteur personnalisé pour effectuer une fonction d'agrégation. Lorsque je vois l'utilisation du processeur à l'aide de htop, il affiche tous les CPU les cœurs étant utilisés pour la version `streams 'et' parallel streams '. Donc, il semble que lorsque list.stream () est utilisé, il utilise également tous les processeurs. Ici, quelle est la différence précise entre - parallelStream () et stream () en termes de tilisation du multicœur.

31
Yogi Joshi

Considérez le programme suivant:

import Java.util.ArrayList;
import Java.util.List;

public class Foo {
    public static void main(String... args) {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 1000; i++) {
            list.add(i);
        }
        list.stream().forEach(System.out::println);
    }
}

Vous remarquerez que ce programme affichera les nombres de 0 à 999 séquentiellement, dans l'ordre dans lequel ils sont dans la liste. Si nous changeons stream() en parallelStream() ce n'est plus le cas (du moins sur mon ordinateur): tous les nombres sont écrits, mais dans un ordre différent. Donc, apparemment, parallelStream() utilise en effet plusieurs threads.

Le htop s'explique par le fait que même les applications à thread unique sont réparties sur plusieurs cœurs par la plupart des systèmes d'exploitation modernes (des parties du même thread peuvent s'exécuter sur plusieurs cœurs, mais bien sûr pas en même temps). Donc, si vous voyez qu'un processus a utilisé plusieurs cœurs, cela ne signifie pas nécessairement que le programme utilise plusieurs threads.

De plus, les performances peuvent ne pas s'améliorer lors de l'utilisation de plusieurs threads. Le coût de la synchronisation peut réduire à néant les avantages de l'utilisation de plusieurs threads. Pour les scénarios de test simples, c'est souvent le cas. Par exemple, dans l'exemple ci-dessus, System.out Est synchronisé. Donc, effectivement, seul un nombre peut être écrit en même temps, bien que plusieurs threads soient utilisés.

45
Hoopje