首頁 >Java >java教程 >TaskExecutor介面與型別介紹

TaskExecutor介面與型別介紹

零下一度
零下一度原創
2017-06-25 09:39:101912瀏覽

一 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類別的包裝。有另一個備選, ThreadPoolTask​​Executor類,它暴露了Executor的配置參數作為bean屬性。很少需要使用ConcurrentTaskExecutor, 但是如果ThreadPoolTask​​Executor不敷所需,ConcurrentTaskExecutor是另一個替代品。

  • SimpleThreadPoolTask​​Executor 類別

  這個實作其實是Quartz的SimpleThreadPool類別的子類,它會監聽Spring的生命週期回呼。當你有線程池,需要在Quartz和非Quartz元件中共用時,這是它的典型用處。

  • ThreadPoolTask​​Executor 類別

#  它不支援任何對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應用的最重要的類。和SimpleThreadPoolTask​​Executor類似,這個類別實作了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);      
            }  
        } 
}
View Code

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

 

以上是TaskExecutor介面與型別介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn