[JAVA] À propos du nombre de threads de Completable Future

introduction

CompletableFuture Il semble qu'il y ait une limite supérieure sur le nombre de threads qui peuvent être définis si vous ne le définissez pas après avoir vérifié le nombre de threads, j'ai donc recherché le paramètre et dépassé la limite supérieure.

Traitons la liste de Completable Future pour le moment

Pour le moment, faisons une liste et traitons-la sans penser à rien. Cela me ferme les yeux que ce que je fais est salé.

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class Main {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        List<CompletableFuture<String>> list = new ArrayList<>();
        for(int i = 0; i < 100; i++) {
            list.add(CompletableFuture.supplyAsync(() -> {
                try {
                    System.out.println(Thread.currentThread().getName());
                    Thread.sleep(1000);
                } catch (InterruptedException e) {

                }
                return "a";
            }));
        }
        
        CompletableFuture<Void> cf = CompletableFuture.allOf(
                list.toArray(new CompletableFuture[list.size()]));
        
        cf.whenComplete((ret, ex) -> {
            System.out.println(ret);
            System.out.println(ex);
          });

        Thread.sleep(20000);
        System.out.println("end");
    }
}

Comme vous pouvez le voir en exécutant ceci, seuls 3 threads (4 core PC) sont démarrés. Cela ne fonctionne pas comme je m'attendais à démarrer quelque chose comme 100 dans le code.

ForkJoinPool.commonPool-worker-2
ForkJoinPool.commonPool-worker-1
ForkJoinPool.commonPool-worker-3
ForkJoinPool.commonPool-worker-2
ForkJoinPool.commonPool-worker-3
ForkJoinPool.commonPool-worker-1
ForkJoinPool.commonPool-worker-2
ForkJoinPool.commonPool-worker-3
ForkJoinPool.commonPool-worker-1
ForkJoinPool.commonPool-worker-2
null
null
end

Essayez d'augmenter le nombre de threads

Par conséquent, augmentez le nombre de threads qui peuvent être démarrés. supplyAsync peut prendre ʻExecutor comme argument, et il est possible de faire divers réglages avec java.util.concurrent.Executors`.

Tout d'abord, déplaçons-le pour que vous puissiez créer autant de tâches que vous le souhaitez avec ʻExecutors.newFixedThreadPool (100) `.

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ExecutorService pool = Executors.newFixedThreadPool(100);
        
        List<CompletableFuture<String>> list = new ArrayList<>();
        for(int i = 0; i < 100; i++) {
            list.add(CompletableFuture.supplyAsync(() -> {
                try {
                    System.out.println(Thread.currentThread().getName());
                    Thread.sleep(10000);
                } catch (InterruptedException e) {

                }
                return "a";
            }, pool));
        }
        
        CompletableFuture<Void> cf = CompletableFuture.allOf(
                list.toArray(new CompletableFuture[list.size()]));
        
        cf.whenComplete((ret, ex) -> {
            System.out.println(ret);
            System.out.println(ex);
          });

        Thread.sleep(20000);
        System.out.println("end");
    }
}

Si vous faites cela, vous verrez que 100 threads sont en cours d'exécution.

pool-1-thread-1
pool-1-thread-4
pool-1-thread-3
pool-1-thread-2
pool-1-thread-6
pool-1-thread-5
pool-1-thread-7
pool-1-thread-10
pool-1-thread-11
pool-1-thread-12
pool-1-thread-13
pool-1-thread-15
pool-1-thread-14
pool-1-thread-9
pool-1-thread-16
pool-1-thread-17
pool-1-thread-18
pool-1-thread-20
pool-1-thread-19
pool-1-thread-8
pool-1-thread-22
pool-1-thread-23
pool-1-thread-25
pool-1-thread-21
pool-1-thread-24
pool-1-thread-26
pool-1-thread-27
pool-1-thread-29
pool-1-thread-28
pool-1-thread-30
pool-1-thread-31
pool-1-thread-32
pool-1-thread-34
pool-1-thread-33
pool-1-thread-36
pool-1-thread-37
pool-1-thread-35
pool-1-thread-38
pool-1-thread-40
pool-1-thread-39
pool-1-thread-41
pool-1-thread-42
pool-1-thread-43
pool-1-thread-64
pool-1-thread-60
pool-1-thread-57
pool-1-thread-62
pool-1-thread-59
pool-1-thread-58
pool-1-thread-65
pool-1-thread-71
pool-1-thread-63
pool-1-thread-69
pool-1-thread-70
pool-1-thread-61
pool-1-thread-52
pool-1-thread-53
pool-1-thread-51
pool-1-thread-50
pool-1-thread-49
pool-1-thread-47
pool-1-thread-45
pool-1-thread-46
pool-1-thread-44
pool-1-thread-54
pool-1-thread-55
pool-1-thread-56
pool-1-thread-68
pool-1-thread-66
pool-1-thread-48
pool-1-thread-72
pool-1-thread-73
pool-1-thread-75
pool-1-thread-76
pool-1-thread-74
pool-1-thread-77
pool-1-thread-78
pool-1-thread-80
pool-1-thread-79
pool-1-thread-82
pool-1-thread-81
pool-1-thread-67
pool-1-thread-83
pool-1-thread-84
pool-1-thread-85
pool-1-thread-86
pool-1-thread-87
pool-1-thread-89
pool-1-thread-88
pool-1-thread-90
pool-1-thread-91
pool-1-thread-92
pool-1-thread-94
pool-1-thread-93
pool-1-thread-95
pool-1-thread-96
pool-1-thread-98
pool-1-thread-97
pool-1-thread-99
pool-1-thread-100
null
null
end

À propos des traitements pouvant être effectués avec d'autres exécuteurs

Cette fois, je voulais juste démarrer 100 threads pour le moment, donc je l'ai spécifié avec newFixedThreadPool, mais si vous voulez le réutiliser, vous pouvez utiliser newCachedThreadPool (à partir du code ci-dessus, vous pouvez facilement voir qu'il est utilisé en dormant) ) En fait, si vous voulez corriger un thread, il y a newSingleThreadExecutor, il est donc possible de contrôler le début du thread en fonction de l'objectif. La bonne réponse dépend de l'utilisation prévue, il semble donc nécessaire d'avoir un indice lors de son utilisation.

Cependant, les exécuteurs peuvent également créer un exécuteur qui retarde avec newScheduledThreadPool, mais si cela est défini, le délai sera traité comme 0 seconde, donc cela ne semble pas avoir beaucoup de sens. En ce qui concerne le mouvement, il semble que le mouvement est similaire à newCachedThreadPool. Peut-être que je peux bien le retarder, mais je ne suis pas sûr.

Recommended Posts

À propos du nombre de threads de Completable Future
À propos de la gestion de Null
À propos de la description de Docker-compose.yml
Limiter le nombre de threads à l'aide du service d'exécution de Java
[Ruby] Questions et vérification du nombre d'arguments de méthode
Commande pour vérifier le nombre et l'état des threads Java
À propos du comportement de ruby Hash # ==
À propos des bases du développement Android
À propos du rôle de la méthode initialize
Pensez aux 7 règles d'Optionnel
À propos du niveau de journalisation de java.util.logging.Logger
Qu'est-ce qu'un test? ・ À propos de l'importance d'un test
À propos du fonctionnement de next () et nextLine ()
À propos de l'affichage initial de Spring Framework
[Java] Vérifiez le nombre d'occurrences de caractères
Vérifiez le fonctionnement de l'interface à travers le thread
Pensez à la combinaison de Servlet et Ajax
A propos de l'ordre de description des propriétés système Java
À propos de la méthode
À propos des threads Java
À propos du paquet
J'ai vérifié le nombre de taxis avec Ruby
[Grails] À propos de la zone de paramétrage et des éléments de paramétrage de application.yml
À propos de l'utilité des monades dans une perspective orientée objet
À propos du problème de blocage dans le traitement parallèle dans la version 4.0 de gem'sprockets
Le nombre de chiffres peut-il être Math.log10 (x) .floor + 1?
[Note technique] À propos des avantages et des inconvénients de Ruby
Pensez au problème JAVA = JAVAscript (nécessaire à l'avenir)
Sortie sur la méthode, partie 2
À propos de la classe StringBuilder
Le monde de Clara-Rules (2)
Commentaire: à propos de l'interface
À propos de disconnect () de HttpURLConnection
À propos du pipeline d'actifs
À propos de la double fonction -java
À propos de la sélection d'OpenJDK
À propos de DI of Spring ①
À propos de l'opérateur ternaire
Jugement du calendrier
Le monde de Clara-Rules (4)
À propos de DI of Spring ②
Le monde de Clara-Rules (3)
À propos de la méthode de longueur
À propos du module Kernel
Le monde de Clara-Rules (5)
L'idée du tri rapide
À propos de la méthode cartographique
À propos de la méthode des ancêtres
À propos de form. ○○ de form_with
[Sortie] À propos de la base de données
Enquête future complète sur Java 8