Spring線程池應用 – JAVA編程語言程序開發技術文章

1.瞭解 TaskExecutor接口
    Spring的TaskExecutor接口等同於java.util.concurrent.Executor接口。 實際上,它存在的主要原因是為瞭在使用線程池的時候,將對Java 5的依賴抽象出來。 這個接口隻有一個方法execute(Runnable task),它根據線程池的語義和配置,來接受一個執行任務。最初創建TaskExecutor是為瞭在需要時給其他Spring組件提供一個線程池的抽象。 例如ApplicationEventMulticaster組件、JMS的 AbstractMessageListenerContainer和對Quartz的整合都使用瞭TaskExecutor抽象來提供線程池。 當然,如果你的bean需要線程池行為,你也可以使用這個抽象層。
 
2. TaskExecutor接口的實現類
    (1)SimpleAsyncTaskExecutor 類
這個實現不重用任何線程,或者說它每次調用都啟動一個新線程。但是,它還是支持對並發總數設限,當超過線程並發總數限制時,阻塞新的調用,直到有位置被釋放。如果你需要真正的池,請繼續往下看。
 
    (2)SyncTaskExecutor類
這個實現不會異步執行。相反,每次調用都在發起調用的線程中執行。它的主要用處是在不需要多線程的時候,比如簡單的test case。
 
    (3)ConcurrentTaskExecutor 類
這個實現是對Java 5 java.util.concurrent.Executor類的包裝。有另一個備選, ThreadPoolTaskExecutor類,它暴露瞭Executor的配置參數作為bean屬性。很少需要使用ConcurrentTaskExecutor, 但是如果ThreadPoolTaskExecutor不敷所需,ConcurrentTaskExecutor是另外一個備選。
    (4)SimpleThreadPoolTaskExecutor 類
這個實現實際上是Quartz的SimpleThreadPool類的子類,它會監聽Spring的生命周期回調。當你有線程池,需要在Quartz和非Quartz組件中共用時,這是它的典型用處。
    (5)ThreadPoolTaskExecutor 類
它不支持任何對java.util.concurrent包的替換或者下行移植。Doug Lea和Dawid Kurzyniec對java.util.concurrent的實現都采用瞭不同的包結構,導致它們無法正確運行。 這個實現隻能在Java 5環境中使用,但是卻是這個環境中最常用的。它暴露的bean properties可以用來配置一個java.util.concurrent.ThreadPoolExecutor,把它包裝到一個TaskExecutor中。如果你需要更加先進的類,比如ScheduledThreadPoolExecutor,我們建議你使用ConcurrentTaskExecutor來替代。
    (6)TimerTaskExecutor類
這個實現使用一個TimerTask作為其背後的實現。它和SyncTaskExecutor的不同在於,方法調用是在一個獨立的線程中進行的,雖然在那個線程中是同步的。
    (7)WorkManagerTaskExecutor類
這個實現使用瞭CommonJ WorkManager作為其底層實現,是在Spring context中配置CommonJ WorkManager應用的最重要的類。和SimpleThreadPoolTaskExecutor類似,這個類實現瞭WorkManager接口,因此可以直接作為WorkManager使用。
3.線程池Demo之  ThreadPoolTaskExecutor
    (1)編寫測試類
Java代碼 
import org.springframework.core.task.TaskExecutor; 
 
public class TaskExecutorExample { 
    private TaskExecutor taskExecutor; 
    public TaskExecutorExample(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)spring的配置
Java代碼 
<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> 
<bean id="taskExecutorExample" class="powercn.TaskExecutorExample">  
    <constructor-arg ref="taskExecutor" /> 
</bean> 
 
(3)調用
Java代碼 
ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml"); 
         
TaskExecutorExample te = (TaskExecutorExample)appContext.getBean("taskExecutorExample"); 
te.printMessages(); 
System.out.println("11111111111111111111111"); 

發佈留言