web-dev-qa-db-fra.com

Paralléliser une boucle for dans Java utilisant le multithreading

Je suis très nouveau à Java et je veux paralléliser une boucle imbriquée pour en utilisant le service exécuteur ou en utilisant toute autre méthode en Java. Je veux créer un nombre fixe de threads afin que le CPU ne soit pas complètement acquis par les threads.

    for(SellerNames sellerNames : sellerDataList) {
        for(String selleName : sellerNames) {
        //getSellerAddress(sellerName)
        //parallize this task
        }
    }

taille de sellerDataList = 1000 et taille de sellerNames = 5000.

Maintenant, je veux créer 10 threads et affecter un morceau de tâche égal à chaque thread de manière égale. C'est pour le ième vendeurDataList, le premier thread devrait obtenir l'adresse pour 500 noms, le deuxième thread devrait obtenir l'adresse pour les 500 noms suivants et ainsi de suite.
Quelle est la meilleure façon de faire ce travail?

9
Jhutan Debnath

Il existe deux façons de le faire fonctionner en parallèle: Streams et Executors.

Utilisation de flux

Vous pouvez utiliser des flux parallèles et laisser le reste au jvm. Dans ce cas, vous n'avez pas trop de contrôle sur ce qui se passe quand. En revanche votre code sera facile à lire et à maintenir:

    sellerDataList.stream().forEach(sellerNames -> {
        Stream<String> stream = StreamSupport.stream(sellerNames.spliterator(), true); // true means use parallel stream
        stream.forEach(sellerName -> {
            getSellerAddress(sellerName);
        });
    });

Utilisation d'un ExecutorService

Supposons que vous souhaitiez 5 threads et que vous souhaitiez pouvoir attendre la fin de la tâche. Ensuite, vous pouvez utiliser un pool de threads fixe avec 5 threads et utiliser Future- s pour pouvoir attendre qu'ils soient terminés.

    final ExecutorService executor = Executors.newFixedThreadPool(5); // it's just an arbitrary number
    final List<Future<?>> futures = new ArrayList<>();
    for (SellerNames sellerNames : sellerDataList) {
        for (final String sellerName : sellerNames) {
            Future<?> future = executor.submit(() -> {
                getSellerAddress(sellerName);
            });
            futures.add(future);
        }
    }
    try {
        for (Future<?> future : futures) {
            future.get(); // do anything you need, e.g. isDone(), ...
        }
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    }
13
Tamas Rev