Table des matières
One : ThreadPoolTaskExecuto
1 ThreadpoolTasksCheduler planifie régulièrement les pools de threads de tâche pour traiter les tâches asynchrones
1 Utilisez @EnableScheduled pour activer la prise en charge
Maison Java javaDidacticiel Comment implémenter le propre pool de threads de Springboot

Comment implémenter le propre pool de threads de Springboot

Jun 28, 2023 pm 04:33 PM
线程池

One : ThreadPoolTaskExecuto

1 ThreadPoolTaskExecutor Pool de threads :

ThreadPoolTaskExecutor est l'encapsulation secondaire de Spring basée sur le propre pool de threads de Java, ThreadPoolExecutor. L'objectif principal est de rendre plus pratique l'utilisation des pools de threads dans le système Spring Framework. Pool de threads Spring

2 Utilisez ThreadPoolTaskExecutor pour injecter des beans dans ioc
Formulaire de fichier de configuration, Spring configurera automatiquement

## 默认线程池配置,ThreadPoolTaskExecutor 
# 核心线程数
spring.task.execution.pool.core-size=8  
# 最大线程数
spring.task.execution.pool.max-size=16
# 空闲线程存活时间
spring.task.execution.pool.keep-alive=60s
# 是否允许核心线程超时
spring.task.execution.pool.allow-core-thread-timeout=true
# 线程队列数量
spring.task.execution.pool.queue-capacity=100
# 线程关闭等待
spring.task.execution.shutdown.await-termination=false
spring.task.execution.shutdown.await-termination-period=
# 线程名称前缀
spring.task.execution.thread-name-prefix=demo_Thread
Copier après la connexion

Formulaire de configuration :

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.Executor;
import java.util.concurrent.ScheduledFuture;
//@Configuration
public class ThreadConfig {
    @Value("${task.maxPoolSize}")
    private int maxPoolSize;
    //todo 其他的相关配置都可以通过配置文件中注入
    @Bean("ThreadPoolTaskExecutor")
    public Executor myAsync() {
        final ThreadPoolTaskExecutor executor =
                new ThreadPoolTaskExecutor();
        executor.setMaxPoolSize(maxPoolSize);
        //todo  其他参数设置
        //初始化
        executor.initialize();
        return executor;
    }
}
Copier après la connexion

3 Après la création des threads, tous les pools de threads sont obtenus à partir d'ioc

4 Processus de traitement du pool de threads :

(1) Vérifiez si le pool de threads principaux est plein. Sinon, créez un thread pour effectuer la tâche. Si le nombre de threads principaux est plein, vérifiez si la file d'attente des tâches est pleine. Sinon, stockez le thread dans. la file d'attente des tâches. Si la file d'attente des tâches est pleine, vérifiez le nombre maximum de threads. Si le nombre n'est pas satisfait, créez un thread pour exécuter la tâche. Si elle est pleine, exécutez-la conformément à la politique de rejet.

    CallerRunsPolicy() : exécution du thread d'origine
  • AbortPolicy() : lancer une exception directement
  • DiscardPolicy() : rejeter directement
  • DiscardOldestPolicy() : supprimer la tâche la plus ancienne de la file d'attente
  • 2: ThreadPoolTasksCheduler

1 ThreadpoolTasksCheduler planifie régulièrement les pools de threads de tâche pour traiter les tâches asynchrones

2 Utilisation: Inject ThreadpoolTaskscheduler Bean

(1) Format de fichier de configuration: ..

(2) Format de la classe de configuration:

rreea
3 Utilisez les tâches planifiées ThreadPoolTaskScheduler

pour utiliser le pool de threads ordinaire :

    soumettre (appelable), besoin d'exécuter le résultat
  • soumettre (exécutable), aucun résultat d'exécution n'est requis
  • (1) Tâche planifiée

Ajouter le contenu de la tâche Exécutable, définir le cycle d'exécution Déclencheur/Date, Expression de déclenchement Baidu peut

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ScheduledFuture;
@Configuration
public class ThreadPoolTaskSchedulerConfig {
    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
        final ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
        //设置等待任务在关机时l候完成
        threadPoolTaskScheduler.setWaitForTasksToCompleteOnShutdown(true);
        //设置等待时间为60s
        threadPoolTaskScheduler.setAwaitTerminationSeconds(60);
        return threadPoolTaskScheduler;
    }
}
Copier après la connexion

(2) Spécifier l'intervalle Temps d'exécution d'une tâche, l'intervalle de temps va de l'achèvement de la tâche précédente au début de la tâche suivante , en millisecondes

 schedule(Runnable task,Trigger)
 schedule(Runnable task,Date)
Copier après la connexion

(3) Exécutez des tâches à une fréquence fixe, exécutez de nouvelles tâches à intervalles réguliers après le début de la tâche, si la dernière tâche est terminée, puis attendez que la tâche suivante soit exécutée une fois la dernière exécution de la tâche terminée

 scheduleWithFixedDelay(Runnable task,long delay)
Copier après la connexion

(4) Annulation de tâche planifiée :

Définissez la collection pour le stockage des tâches planifiées. Le résultat de l'exécution de la tâche planifiée est ScheduledFuture, et stockez l'objet dans la collection, annulez la tâche planifiée en obtenant le ScheduledFuture object.cancel(true) dans la collection

 scheduleAtFixedRate(Runnable task,long delay)
Copier après la connexion

Trois @Scheduled implémente la tâche planifiée, l'annotation active la tâche planifiée

1 Utilisez @EnableScheduled pour activer la prise en charge

2 @Méthode d'annotation planifiée

(1) @ Scheduled(fixedDelay=5000) exécution différée, exécutée après 5 secondes

(2) @Scheduled(fixedRate=5000) exécution planifiée, exécutée toutes les cinq secondes

(3) @Scheduled(corn="002* *?") Exécution personnalisée, maïs expression Baidu, cette méthode d'exécution est couramment utilisée, corn="002**?"Commencez à exécuter les tâches planifiées à deux heures du matin tous les jours

3 Notez que les tâches démarrées par @Scheduled sont monothread, facile à bloquer

(1) Injectez ThreadPoolTaskScheduler dans ioc, puis Scheduled utilisera le pool de threads ThreadPoolTaskScheduler, ce qui peut résoudre le problème de blocage d'un seul thread

(2) Les annotations @Scheduled et @Async activent les tâches planifiées, spécifiées dans @Async("pool" ) Pool de threads, s'il n'y a pas de pool de threads spécifié, le pool de threads SimpleAsyncTaskExecutor de Spring sera utilisé. Ce pool de threads ajoutera un thread pour exécuter la tâche à chaque fois, ce qui est inefficace 4 : Tâches asynchrones au Spring


1 @EnableAsync tourne. sur le support asynchrone

2 @Async active les tâches asynchrones et spécifie le pool de threads

Remarque : les annotations @Scheduled et @Async activent les tâches planifiées et spécifient le pool de threads dans @Async("pool"). Le pool de threads SimpleAsyncTaskExecutor de Spring sera utilisé.Ce pool de threads ajoutera un thread pour exécuter la tâche à chaque fois, ce qui est inefficace. Cependant, si @Async active la tâche asynchrone séparément, il est recommandé d'utiliser le pool de threads par défaut. pour personnaliser le pool de threads en fonction des besoins. Remarque : La valeur de retour de @Async ne peut être que void ou Future, l'appelant et @Async ne peuvent pas être dans la même classe, sinon aop ne sera pas utilisé

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Service;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.*;
@Service
public class SchedulerService {
    @Autowired
    ThreadPoolTaskScheduler scheduler;
    /**
     * 常规线程池使用
     */
    public void tesScheduler1() throws ExecutionException, InterruptedException {
        //无返回值
        final Future<?> demo_scheduler1 = scheduler.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println("demo runnable scheduler");
            }
        });
        //无返回值
        final Future<?> demo_scheduler2 = scheduler.submit(new Callable<Object>() {
            @Override
            public Object call() throws Exception {
                System.out.println("demo callable  scheduler");
                return "callable";
            }
        });
        System.out.println("result:" + demo_scheduler2.get());
    }
    /**
     * 定时任务
     */
    public void tesScheduler2() throws ParseException {
        //CronTrigger表达式百度即可
        scheduler.schedule(() -> {
            System.out.println("定时任务");
        }, new CronTrigger("0/1****?"));
        //创建指定时间的日期
        final Date date = new Date(2023, 3, 26, 21, 35);
        final DateFormat format = new SimpleDateFormat();
        final Date parse = format.parse("2023-03-26-21-26");
        scheduler.schedule(() -> {
            System.out.println(new Date());
        }, parse);
    }
    /**
     * 指定时间间隔执行任务,上次任务结束到下次任务开始的时间间隔
     */
    public void tesScheduler3() {
        scheduler.scheduleWithFixedDelay(() -> {
            //todo
        }, 300L);
    }
    /**
     * 固定频率执行任务,在固定一段时间后便会执行下次任务,
     * 如果时间到了上次任务还没执行完毕则等待,
     * 直到上一次任务执行完毕后立马执行下次任务
     */
    public void tesScheduler4() {
        scheduler.scheduleAtFixedRate(new FutureTask<String>(new Callable<String>() {
                    @Override
                    public String call() throws Exception {
                        return null;
                    }
                }),
                200);
    }
    //取消定时任务队列
    public static ConcurrentMap<String, ScheduledFuture> map = new ConcurrentHashMap<>();
    public void startTask(String k1) {
        map.compute(k1, (k, v) -> {
            if (map.containsKey(k)) return v;
            map.put(k, v);
            return v;
        });
    }
}
Copier après la connexion

Five: Present ; un pool de threads Java personnalisé :

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
public class AsyncService {
    @Async
    public void showThreadName1() {
        //默认线程池
        System.out.println(Thread.currentThread().getName());
    }
    @Async("myPool")//指定线程池
    public void showThreadName2() {
        System.out.println(Thread.currentThread().getName());
    }
}
Copier après la connexion

le propre pool de threads de Java, cache, numéro fixe, monothread, chronométré,,,, six ou sept types, à suivre plus tard

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 de ce site Web
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Python obtient des informations et des avis sur les attractions touristiques et crée des nuages ​​de mots et une visualisation de données Python obtient des informations et des avis sur les attractions touristiques et crée des nuages ​​de mots et une visualisation de données Apr 11, 2023 pm 08:49 PM

Bonjour à tous, je suis M. Zhanshu ! Comme le dit le proverbe : ne serait-il pas formidable d’avoir des amis de loin ? C'est une chose très heureuse d'avoir des amis qui viennent jouer avec nous, nous devons donc faire de notre mieux pour être propriétaires et emmener nos amis jouer ! La question est donc de savoir quel est le meilleur moment, où aller et quel est l’endroit le plus amusant ? Aujourd'hui, je vais vous apprendre étape par étape comment utiliser le pool de threads pour explorer les informations sur les attractions, examiner les données du même voyage et créer un nuage de mots et une visualisation des données ! ! ! Informez-vous des informations sur les attractions touristiques de différentes villes. Avant de commencer à explorer les données, commençons par comprendre les threads. Processus de thread : un processus est une activité de code en cours d'exécution sur une collection de données. Il s'agit de l'unité de base de l'allocation et de la planification des ressources dans le système. Thread : Il s’agit d’un processus léger, de la plus petite unité d’exécution de programme et d’un chemin d’exécution du processus. un

Problèmes courants de charge de serveur sous les systèmes Linux et leurs solutions Problèmes courants de charge de serveur sous les systèmes Linux et leurs solutions Jun 18, 2023 am 09:22 AM

Linux est un excellent système d'exploitation largement utilisé dans les systèmes serveurs. Lors de l'utilisation des systèmes Linux, les problèmes de charge du serveur sont un phénomène courant. La charge du serveur signifie que les ressources système du serveur ne peuvent pas satisfaire les demandes actuelles, ce qui rend la charge du système trop élevée, affectant ainsi les performances du serveur. Cet article présentera les problèmes courants de charge de serveur et leurs solutions sous les systèmes Linux. 1. La charge du processeur est trop élevée. Lorsque la charge du processeur du serveur est trop élevée, cela entraînera des problèmes tels qu'une réponse plus lente du système et un temps de traitement des requêtes plus long. Quand C

Comment utiliser le pool de threads pour implémenter la planification circulaire des tâches dans Java 7 Comment utiliser le pool de threads pour implémenter la planification circulaire des tâches dans Java 7 Jul 29, 2023 pm 10:37 PM

Comment utiliser des pools de threads pour implémenter la planification cyclique des tâches dans Java 7 Introduction : lors du développement d'applications Java, l'utilisation de pools de threads peut améliorer l'efficacité de l'exécution des tâches et l'utilisation des ressources. En Java7, le pool de threads peut être utilisé pour implémenter facilement une planification circulaire des tâches. Cet article expliquera comment utiliser les pools de threads pour implémenter la planification circulaire des tâches dans Java7 et joindra des exemples de code correspondants. 1. Présentation : le pool de threads est une structure de traitement multithread qui peut réutiliser un nombre fixe de threads pour éviter la création et la création fréquentes.

Comment utiliser le pool de threads pour implémenter la planification prioritaire des tâches dans Java 7 Comment utiliser le pool de threads pour implémenter la planification prioritaire des tâches dans Java 7 Jul 30, 2023 pm 06:38 PM

Comment utiliser les pools de threads pour implémenter la planification prioritaire des tâches dans Java7 Dans la programmation simultanée, la planification prioritaire des tâches est une exigence courante. Java fournit un mécanisme de pool de threads qui nous permet de gérer et de planifier facilement des tâches. Cet article explique comment utiliser le pool de threads pour implémenter la planification par priorité des tâches dans Java7. Tout d’abord, nous devons comprendre les concepts de base et l’utilisation des pools de threads en Java7. Un pool de threads est un mécanisme de réutilisation de threads qui gère et planifie un groupe de threads pour effectuer plusieurs tâches. Mention Java

Comment gérer le pool de threads de service et la planification des tâches dans une architecture de microservices ? Comment gérer le pool de threads de service et la planification des tâches dans une architecture de microservices ? May 17, 2023 am 08:36 AM

Avec l'application généralisée de l'architecture des microservices dans les applications d'entreprise, la manière d'optimiser les performances et la stabilité des microservices est également devenue le centre d'attention. Dans les microservices, un microservice peut gérer des milliers de requêtes, et le pool de threads et la planification des tâches du service sont également des composants importants des performances et de la stabilité du microservice. Cet article présentera les pools de threads et la planification des tâches dans l'architecture des microservices, ainsi que comment optimiser les performances des pools de threads et la planification des tâches dans les microservices. 1. Pool de threads dans l'architecture microservice Dans l'architecture microservice, chaque requête traitée par le microservice occupera son pool de threads.

Comment utiliser la fonction ExecutorCompletionService en Java pour la planification des tâches du pool de threads Comment utiliser la fonction ExecutorCompletionService en Java pour la planification des tâches du pool de threads Jun 26, 2023 pm 02:49 PM

Avec le développement de la technologie Internet, l’importance de la programmation multithread est devenue de plus en plus importante. Lors de l'écriture de programmes à haute concurrence, l'utilisation complète de la technologie multithread peut considérablement améliorer l'efficacité d'exécution du programme. Cependant, la programmation multithread elle-même implique de nombreux problèmes, tels que la communication entre les threads, la coopération en matière de synchronisation, etc. Afin de résoudre ces problèmes, Java fournit de nombreux frameworks de pools de threads, parmi lesquels ExecutorCompletionService en fait partie. Cet article présentera ExecutorCompletionServi

Où le pool de threads Spring est-il configuré ? Où le pool de threads Spring est-il configuré ? Jan 19, 2024 pm 04:55 PM

Méthodes pour configurer le pool de threads Spring : 1. Utilisez ThreadPoolTaskExecutor Bean ; 2. Utilisez SimpleAsyncTaskExecutor ; 3. Utilisez TaskExecutor Bean en XML 4. Utilisez des bibliothèques tierces ; 6. Configurez via les propriétés système ou les variables d'environnement ; 7. Intégration et conteneurs ; 8. Configuration programmatique ; 9. Intégration à l'aide de frameworks tiers ; 11. Tenir compte des limitations et contraintes des ressources ;

Comment implémenter le propre pool de threads de Springboot Comment implémenter le propre pool de threads de Springboot Jun 28, 2023 pm 04:33 PM

1 : ThreadPoolTaskExecuto1 ThreadPoolTaskExecutor Pool de threads : ThreadPoolTaskExecutor est une encapsulation secondaire de Spring basée sur le propre pool de threads de Java, ThreadPoolExecutor. L'objectif principal est de rendre plus pratique l'utilisation des pools de threads dans le système de framework Spring. .Utilisez ThreadPoolTaskExecutor pour injecter des beans Accédez au formulaire du fichier de configuration dans ioc, Spring configurera automatiquement ##Configuration du pool de threads par défaut, ThreadPoolTaskExecutor#Core.

See all articles