Maison  >  Article  >  Java  >  Pool de threads en Java

Pool de threads en Java

WBOY
WBOYoriginal
2023-06-15 20:51:481365parcourir

En Java, les pools de threads sont utilisés pour gérer des tâches telles que la création, la maintenance et la destruction de threads. Le pool de threads contient un groupe de threads et une file d'attente de tâches. Lorsqu'une tâche doit être exécutée, les threads du pool de threads obtiendront automatiquement la tâche et l'exécuteront. Une fois la tâche exécutée, le thread sera également recyclé dans le pool de threads. pool de threads pour réutilisation.

L'API de pool de threads en Java fournit une classe Executors pour nous aider à créer un pool de threads et fournit quatre méthodes d'implémentation de pool de threads : FixedThreadPool, CachedThreadPool, SingleThreadExecutor et ScheduledThreadPool.

FixedThreadPool

Un pool de threads de taille fixe Ce n'est que lorsque le nombre de threads de travail n'atteint pas la taille du pool de threads qu'un nouveau thread sera créé pour effectuer des tâches. Le pool de threads peut spécifier le nombre maximum de threads via le constructeur. S'il n'est pas spécifié, la valeur par défaut est Integer.MAX_VALUE.

Exemple de code :

ExecutorService executorService = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
    executorService.execute(()->{
        System.out.println(Thread.currentThread().getName()+" is executing task ");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    });
}

Résultat d'exécution :

pool-1-thread-1 is executing task 
pool-1-thread-3 is executing task 
pool-1-thread-5 is executing task 
pool-1-thread-2 is executing task 
pool-1-thread-4 is executing task 
pool-1-thread-5 is executing task 
pool-1-thread-3 is executing task 
pool-1-thread-1 is executing task 
pool-1-thread-2 is executing task 
pool-1-thread-4 is executing task 

CachedThreadPool

Pool de threads pouvant être mis en cache lorsque le nombre de threads dépasse le nombre actuellement requis, les threads excédentaires seront recyclés dans le pool de threads lorsqu'ils ne sont pas nécessaires. sera automatiquement détruit. Si le pool de threads n'a aucun thread disponible et qu'une nouvelle tâche arrive, le pool de threads créera un nouveau thread pour exécuter la tâche jusqu'à ce que la taille du pool de threads atteigne la limite de Integer.MAX_VALUE.

Exemple de code :

ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
    executorService.execute(()->{
        System.out.println(Thread.currentThread().getName()+" is executing task ");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    });
}

Résultat d'exécution :

pool-1-thread-1 is executing task 
pool-1-thread-2 is executing task 
pool-1-thread-3 is executing task 
pool-1-thread-4 is executing task 
pool-1-thread-5 is executing task 
pool-1-thread-6 is executing task 
pool-1-thread-7 is executing task 
pool-1-thread-8 is executing task 
pool-1-thread-9 is executing task 
pool-1-thread-10 is executing task 

SingleThreadExecutor

Un pool de threads monothread, avec un seul thread de travail, peut garantir que toutes les tâches sont exécutées dans l'ordre spécifié (FIFO, LIFO, priorité, etc.) , ce qui équivaut à un FixedThreadPool spécial.

Exemple de code :

ExecutorService executorService = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
    executorService.execute(()->{
        System.out.println(Thread.currentThread().getName()+" is executing task ");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    });
}

Résultat d'exécution :

pool-1-thread-1 is executing task 
pool-1-thread-1 is executing task 
pool-1-thread-1 is executing task
......

ScheduledThreadPool

Le pool de threads planifiés peut exécuter des tâches en fonction du délai spécifié ou périodiquement, et peut implémenter des tâches planifiées ou des tâches périodiques. La taille du pool de threads peut être spécifiée. Si elle n'est pas spécifiée, sa valeur par défaut est Integer.MAX_VALUE.

Exemple de code :

ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3);
ScheduledFuture<?> future = scheduledExecutorService.schedule(()->{
    System.out.println(Thread.currentThread().getName()+" is executing delay task ");
}, 5, TimeUnit.SECONDS);
scheduledExecutorService.scheduleAtFixedRate(()->{
    System.out.println(Thread.currentThread().getName()+" is executing periodic task ");
}, 2, 3, TimeUnit.SECONDS);

Résultats d'exécution :

pool-1-thread-1 is executing periodic task 
pool-1-thread-2 is executing periodic task 
pool-1-thread-3 is executing periodic task 
pool-1-thread-1 is executing periodic task 
pool-1-thread-3 is executing periodic task 
pool-1-thread-2 is executing periodic task 
pool-1-thread-3 is executing periodic task 
pool-1-thread-2 is executing periodic task 
......
pool-1-thread-1 is executing delay task 

Résumé

Le pool de threads est un concept extrêmement important dans le développement multithread, qui peut réduire efficacement la surcharge de création, de destruction et de changement de contexte des threads, améliorer les performances et la maintenabilité du système. . Java fournit la classe Executors pour créer facilement des pools de threads et propose différentes méthodes d'implémentation pour gérer différents scénarios d'application. Lorsque les développeurs utilisent des pools de threads, ils doivent choisir une méthode d'implémentation appropriée en fonction des besoins spécifiques et des conditions de charge pour obtenir les meilleures performances et effets.

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!

Déclaration:
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