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