一 TaskExecutor介面
Spring的TaskExecutor介面等同於Java.util.concurrent.Executor介面。 實際上,它存在的主要原因是為了在使用執行緒池的時候,將對Java 5的依賴抽象化。 這個介面只有一個方法execute(Runnable task),它根據執行緒池的語意和配置,來接受一個執行任務。
最初創建TaskExecutor是為了在需要時給其他Spring元件提供一個線程池的抽象。 例如ApplicationEventMulticaster元件、JMS的AbstractMessageListenerContainer和對Quartz的整合都使用了TaskExecutor抽象來提供執行緒池。 當然,如果你的bean需要執行緒池行為,你也可以使用這個抽象層。
二 TaskExecutor類型
# 在Spring發行包中預先定義了一些TaskExecutor實作。有了它們,你甚至不需要再自行實現了。
SimpleAsyncTaskExecutor 類別
# 這個實作不重複使用任何線程,或者說它每次呼叫都啟動一個新線程。但是,它還是支援對並發總數設限,當超過線程並發總數限制時,阻塞新的調用,直到有位置被釋放。如果你需要真正的池,請繼續往下看。
SyncTaskExecutor類別
# 這個實作不會非同步執行。相反,每次呼叫都在發起呼叫的執行緒中執行。它的主要用處是在不需要多執行緒的時候,例如簡單的test case。
ConcurrentTaskExecutor 類別
這個實作是Java 5 java.util.concurrent.Executor類別的包裝。有另一個備選, ThreadPoolTaskExecutor類,它暴露了Executor的配置參數作為bean屬性。很少需要使用ConcurrentTaskExecutor, 但是如果ThreadPoolTaskExecutor不敷所需,ConcurrentTaskExecutor是另一個替代品。
SimpleThreadPoolTaskExecutor 類別
這個實作其實是Quartz的SimpleThreadPool類別的子類,它會監聽Spring的生命週期回呼。當你有線程池,需要在Quartz和非Quartz元件中共用時,這是它的典型用處。
ThreadPoolTaskExecutor 類別
# 它不支援任何對java.util.concurrent套件的替換或下行移植。 Doug Lea和Dawid Kurzyniec對java.util.concurrent的實作都採用了不同的套件結構,導致它們無法正確運作。
這個實作只能在Java 5環境中使用,但卻是這個環境中最常使用的。它暴露的bean properties可以用來配置一個java.util.concurrent.ThreadPoolExecutor,把它包裝到一個TaskExecutor。如果你需要更先進的類,例如ScheduledThreadPoolExecutor,我們建議你使用ConcurrentTaskExecutor來替代。
TimerTaskExecutor類別
# 這個實作使用一個TimerTask作為其背後的實作。它和SyncTaskExecutor的不同在於,方法呼叫是在一個獨立的線程中進行的,雖然在那個線程中是同步的。
WorkManagerTaskExecutor類別
# CommonJ 是BEA和IBM共同開發的一套規格。這些規範並非java ee的標準,但它是BEA和IBM的應用伺服器實現的共同標準
這個實現使用了CommonJ WorkManager作為其底層實現,是在Spring context中配置CommonJ WorkManager應用的最重要的類。和SimpleThreadPoolTaskExecutor類似,這個類別實作了WorkManager接口,因此可以直接作為WorkManager使用。
三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>
以上是TaskExecutor介面與型別介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!