Maison Java javaDidacticiel Introduction à l'interface et au type de TaskExecutor

Introduction à l'interface et au type de TaskExecutor

Jun 25, 2017 am 09:39 AM
实例

Interface TaskExecutor

L'interface TaskExecutor de Spring est équivalente à l'interface Java.util.concurrent.Executor. En fait, la principale raison de son existence est d’abstraire la dépendance à Java 5 lors de l’utilisation de pools de threads. Cette interface n'a qu'une seule méthode execute(Runnable task), qui accepte une tâche d'exécution selon la sémantique et la configuration du pool de threads.
TaskExecutor a été créé à l'origine pour fournir une abstraction de pool de threads à d'autres composants Spring en cas de besoin. Par exemple, le composant ApplicationEventMulticaster, AbstractMessageListenerContainer de JMS et l'intégration de Quartz utilisent tous l'abstraction TaskExecutor pour fournir un pool de threads. Bien entendu, vous pouvez également utiliser cette couche d'abstraction si vos beans nécessitent un comportement de pool de threads.

2 Type TaskExecutor

Il existe certaines implémentations de TaskExecutor prédéfinies dans le package de distribution Spring. Avec eux, vous n’avez même plus besoin de le mettre en œuvre vous-même.

  • Classe SimpleAsyncTaskExecutor

Cette implémentation ne réutilise aucun thread ou démarre un nouveau thread à chaque fois qu'elle est appelée. Cependant, il prend toujours en charge la définition d'une limite sur le nombre total de threads simultanés. Lorsque la limite sur le nombre total de threads simultanés est dépassée, les nouveaux appels seront bloqués jusqu'à ce qu'une position soit libérée. Si vous avez besoin d’une vraie piscine, lisez la suite.

  • Classe SyncTaskExecutor

Cette implémentation ne s'exécutera pas de manière asynchrone. Au lieu de cela, chaque appel est exécuté dans le thread à l’origine de l’appel. Son utilisation principale est lorsque le multithreading n'est pas requis, comme dans les cas de test simples.

  • Classe ConcurrentTaskExecutor

Cette implémentation est un wrapper pour la classe Java 5 java.util.concurrent.Executor. Il existe une autre alternative, la classe ThreadPoolTaskExecutor, qui expose les paramètres de configuration de l'Executor en tant que propriétés du bean. Il est rarement nécessaire d'utiliser ConcurrentTaskExecutor, mais si ThreadPoolTaskExecutor ne suffit pas, ConcurrentTaskExecutor est une autre alternative.

  • Classe SimpleThreadPoolTaskExecutor

Cette implémentation est en fait une sous-classe de la classe SimpleThreadPool de Quartz, qui écoute les rappels du cycle de vie de Spring. Il s'agit de son utilisation typique lorsque vous disposez d'un pool de threads qui doit être partagé entre des composants Quartz et non-Quartz.

  • Classe ThreadPoolTaskExecutor

Elle ne prend en charge aucun remplacement ou downport du package java.util.concurrent. Les implémentations de java.util.concurrent par Doug Lea et Dawid Kurzyniec utilisent des structures de packages différentes, ce qui les empêche de fonctionner correctement.

Cette implémentation ne peut être utilisée que dans l'environnement Java 5, mais c'est la plus couramment utilisée dans cet environnement. Les propriétés du bean qu'il expose peuvent être utilisées pour configurer un java.util.concurrent.ThreadPoolExecutor et l'envelopper dans un TaskExecutor. Si vous avez besoin d'une classe plus avancée, telle que ScheduledThreadPoolExecutor, nous vous recommandons d'utiliser plutôt ConcurrentTaskExecutor.

  • Classe TimerTaskExecutor

Cette implémentation utilise une TimerTask comme implémentation derrière elle. La différence entre celui-ci et SyncTaskExecutor est que l'appel de méthode est effectué dans un thread distinct, bien qu'il soit synchronisé dans ce thread.

  • Classe WorkManagerTaskExecutor

CommonJ est un ensemble de spécifications développées conjointement par BEA et IBM. Ces spécifications ne sont pas des normes Java ee, mais ce sont des normes communes pour les implémentations de serveurs d'applications BEA et IBM

Cette implémentation utilise CommonJ WorkManager comme implémentation sous-jacente et est la plus importante pour configurer les applications CommonJ WorkManager dans la classe de contexte Spring. . Semblable à SimpleThreadPoolTaskExecutor, cette classe implémente l'interface WorkManager, elle peut donc être utilisée directement comme WorkManager.

Trois exemples simples de TaskExcutor

1 taskExcutor

package com.test;import org.springframework.core.task.TaskExecutor;public class MainExecutor {     private TaskExecutor taskExecutor;  public MainExecutor (TaskExecutor taskExecutor) {      this.taskExecutor = taskExecutor;    
        }  public void printMessages() {      for(int i = 0; i < 25; i++) {        
                taskExecutor.execute(new MessagePrinterTask("Message" + i));      
            }    
        }  
          
          private class MessagePrinterTask implements Runnable {      private String message;      public MessagePrinterTask(String message) {        this.message = message;      
            }      public void run() {        
                System.out.println(message);      
            }  
        } 
}
Copier après la connexion
Afficher le code

2 principaux

package com.test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class TaskTest {//本地测试,不用部署到tomcatpublic static void main(String[] args) {
        System.out.println("测试任务调度开始..."); 
        ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");     
        MainExecutor te = (MainExecutor)appContext.getBean("taskExecutorExample");  
        te.printMessages();  
        System.out.println("--------"); 
    } 
}
Copier après la connexion
Afficher le code

3.applicationContext.xml配置

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "/spring-beans.dtd"><beans>

 <bean id="taskExecutorExample" class="com.test.MainExecutor">
   <constructor-arg ref="taskExecutor" />
 </bean>

  <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">  <property name="corePoolSize" value="5" />  <property name="maxPoolSize" value="10" />  <property name="queueCapacity" value="25" />
  </bean></beans>
Copier après la connexion
View Code

 

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

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Tags d'article chaud

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)

Exemples SVM en Python Exemples SVM en Python Jun 11, 2023 pm 08:42 PM

Exemples SVM en Python

La relation entre le nombre d'instances Oracle et les performances de la base de données La relation entre le nombre d'instances Oracle et les performances de la base de données Mar 08, 2024 am 09:27 AM

La relation entre le nombre d'instances Oracle et les performances de la base de données

Exemples d'utilisation du code de vérification dans le framework Gin Exemples d'utilisation du code de vérification dans le framework Gin Jun 23, 2023 am 08:10 AM

Exemples d'utilisation du code de vérification dans le framework Gin

Découvrez des exemples de bonnes pratiques de conversion de pointeur dans Golang Découvrez des exemples de bonnes pratiques de conversion de pointeur dans Golang Feb 24, 2024 pm 03:51 PM

Découvrez des exemples de bonnes pratiques de conversion de pointeur dans Golang

Exemple de démarrage de VUE3 : création d'un lecteur vidéo simple Exemple de démarrage de VUE3 : création d'un lecteur vidéo simple Jun 15, 2023 pm 09:42 PM

Exemple de démarrage de VUE3 : création d'un lecteur vidéo simple

Exemple d'algorithme GAN en Python Exemple d'algorithme GAN en Python Jun 10, 2023 am 09:53 AM

Exemple d'algorithme GAN en Python

Exemple de développement d'un robot d'exploration Web simple PHP Exemple de développement d'un robot d'exploration Web simple PHP Jun 13, 2023 pm 06:54 PM

Exemple de développement d'un robot d'exploration Web simple PHP

Exemple d'algorithme VAE en Python Exemple d'algorithme VAE en Python Jun 11, 2023 pm 07:58 PM

Exemple d'algorithme VAE en Python

See all articles