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

Introduction à l'interface et au type de TaskExecutor

零下一度
零下一度original
2017-06-25 09:39:101912parcourir

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);      
            }  
        } 
}
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("--------"); 
    } 
}
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>
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:
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