Heim  >  Artikel  >  Java  >  Einführung in die TaskExecutor-Schnittstelle und -Typen

Einführung in die TaskExecutor-Schnittstelle und -Typen

零下一度
零下一度Original
2017-06-25 09:39:101867Durchsuche

TaskExecutor-Schnittstelle

Die TaskExecutor-Schnittstelle von Spring entspricht der Java.util.concurrent.Executor-Schnittstelle. Tatsächlich besteht der Hauptgrund für seine Existenz darin, die Abhängigkeit von Java 5 bei der Verwendung von Thread-Pools zu abstrahieren. Diese Schnittstelle verfügt nur über eine Methode ausführen (ausführbare Aufgabe), die eine Ausführungsaufgabe entsprechend der Semantik und Konfiguration des Thread-Pools akzeptiert.
TaskExecutor wurde ursprünglich erstellt, um bei Bedarf eine Thread-Pool-Abstraktion für andere Spring-Komponenten bereitzustellen. Beispielsweise verwenden die ApplicationEventMulticaster-Komponente, der AbstractMessageListenerContainer von JMS und die Integration von Quartz alle die TaskExecutor-Abstraktion, um einen Thread-Pool bereitzustellen. Natürlich können Sie diese Abstraktionsschicht auch verwenden, wenn Ihre Beans Thread-Pool-Verhalten erfordern.

2 TaskExecutor-Typ

Im Spring-Distributionspaket sind einige TaskExecutor-Implementierungen vordefiniert. Mit ihnen müssen Sie es nicht einmal mehr selbst umsetzen.

  • SimpleAsyncTaskExecutor-Klasse

Diese Implementierung verwendet keine Threads wieder oder startet bei jedem Aufruf einen neuen Thread. Es wird jedoch weiterhin das Festlegen eines Grenzwerts für die Gesamtzahl gleichzeitiger Threads unterstützt. Wenn der Grenzwert für die Gesamtzahl gleichzeitiger Threads überschritten wird, werden neue Aufrufe blockiert, bis eine Position freigegeben wird. Wenn Sie einen echten Pool benötigen, lesen Sie weiter.

  • SyncTaskExecutor-Klasse

Diese Implementierung wird nicht asynchron ausgeführt. Stattdessen wird jeder Aufruf in dem Thread ausgeführt, der den Aufruf ausgelöst hat. Der Haupteinsatzbereich besteht darin, dass kein Multithreading erforderlich ist, beispielsweise bei einfachen Testfällen.

  • ConcurrentTaskExecutor-Klasse

Diese Implementierung ist ein Wrapper für die Java 5-Klasse java.util.concurrent.Executor. Es gibt eine weitere Alternative, die ThreadPoolTaskExecutor-Klasse, die die Konfigurationsparameter des Executors als Bean-Eigenschaften verfügbar macht. Es ist selten notwendig, ConcurrentTaskExecutor zu verwenden, aber wenn ThreadPoolTaskExecutor nicht ausreicht, ist ConcurrentTaskExecutor eine weitere Alternative.

  • SimpleThreadPoolTaskExecutor-Klasse

Diese Implementierung ist eigentlich eine Unterklasse der SimpleThreadPool-Klasse von Quartz, die auf die Lebenszyklusrückrufe von Spring lauscht. Dies ist die typische Verwendung, wenn Sie über einen Thread-Pool verfügen, der von Quartz- und Nicht-Quartz-Komponenten gemeinsam genutzt werden muss.

  • ThreadPoolTaskExecutor-Klasse

Es wird kein Ersatz oder Downport des java.util.concurrent-Pakets unterstützt. Sowohl die Implementierungen von java.util.concurrent durch Doug Lea als auch Dawid Kurzyniec verwenden unterschiedliche Paketstrukturen, was dazu führt, dass sie nicht korrekt ausgeführt werden.

Diese Implementierung kann nur in der Java 5-Umgebung verwendet werden, wird in dieser Umgebung jedoch am häufigsten verwendet. Die bereitgestellten Bean-Eigenschaften können verwendet werden, um einen java.util.concurrent.ThreadPoolExecutor zu konfigurieren und ihn in einen TaskExecutor einzubinden. Wenn Sie eine erweiterte Klasse wie ScheduledThreadPoolExecutor benötigen, empfehlen wir stattdessen die Verwendung von ConcurrentTaskExecutor.

  • TimerTaskExecutor-Klasse

Diese Implementierung verwendet eine TimerTask als Implementierung dahinter. Der Unterschied zu SyncTaskExecutor besteht darin, dass der Methodenaufruf in einem separaten Thread erfolgt, obwohl er in diesem Thread synchronisiert wird.

  • WorkManagerTaskExecutor-Klasse

CommonJ ist eine Reihe von Spezifikationen, die gemeinsam von BEA und IBM entwickelt wurden. Bei diesen Spezifikationen handelt es sich nicht um Java-EE-Standards, sondern um gemeinsame Standards für BEA- und IBM-Anwendungsserverimplementierungen

Diese Implementierung verwendet CommonJ WorkManager als zugrunde liegende Implementierung und ist die wichtigste für die Konfiguration von CommonJ WorkManager-Anwendungen in der Spring-Kontextklasse . Ähnlich wie SimpleThreadPoolTaskExecutor implementiert diese Klasse die WorkManager-Schnittstelle, sodass sie direkt als WorkManager verwendet werden kann.

Drei einfache Beispiele für 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);      
            }  
        } 
}
Code anzeigen

2 main

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

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

 

Das obige ist der detaillierte Inhalt vonEinführung in die TaskExecutor-Schnittstelle und -Typen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn