1. 程式人生 > >Spring 執行緒池使用

Spring 執行緒池使用

Spring 中預設自帶執行緒池org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor,一般有可以直接使用,這是時候使用的是預設的配置,直接使用@Autowired注入使用

    @Autowired     private ThreadPoolTaskExecutor poolTaskExecutor;

package com.timespark.door.test;

import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**  * @author summer  * @version 建立時間:2018年10月6日 下午3:52:15 類說明  */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:spring-context*.xml", "classpath*:ActiveMQ.xml" }) public class SummerTest {

    @Autowired     private ThreadPoolTaskExecutor poolTaskExecutor;

    @Test     public void testThreadPool() {         poolTaskExecutor.execute(new Runnable() {

            @Override             public void run() {                 System.out.println("要做的事情.......");

            }         });     }

}  

另外一種放方式是自己定義執行緒池的屬性 ,通過xml檔案配置 ,然後通過@Autowired注入,此時注入的變數名要和xml中配置的id一致,否則 Spring 容器中會有兩個執行緒池,一個是預設的,一個是配置的   

<bean id="poolTaskExecutor"  class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">        <!-- 核心執行緒數,預設為1 -->        <property name="corePoolSize" value="5" />        <!-- 最大執行緒數,預設為Integer.MAX_VALUE -->        <property name="maxPoolSize" value="50" />        <!-- 佇列最大長度,一般需要設定值>=notifyScheduledMainExecutor.maxNum;預設為Integer.MAX_VALUE -->        <property name="queueCapacity" value="2000" />        <!-- 執行緒池維護執行緒所允許的空閒時間,預設為60s -->        <property name="keepAliveSeconds" value="100" />        <!-- 執行緒池對拒絕任務(無執行緒可用)的處理策略,目前只支援AbortPolicy、CallerRunsPolicy;預設為後者 -->        <property name="rejectedExecutionHandler">            <!-- AbortPolicy:直接丟擲java.util.concurrent.RejectedExecutionException異常 -->            <!-- CallerRunsPolicy:主執行緒直接執行該任務,執行完之後嘗試新增下一個任務到執行緒池中,可以有效降低向執行緒池內新增任務的速度 -->            <!-- DiscardOldestPolicy:拋棄舊的任務、暫不支援;會導致被丟棄的任務無法再次被執行 -->            <!-- DiscardPolicy:拋棄當前任務、暫不支援;會導致被丟棄的任務無法再次被執行 -->            <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />        </property>     </bean>     

最後一種是基於JDK的執行緒池ThreadPooleExecutor

ThreadPoolExecutor executor = new ThreadPoolExecutor(50, 100, 200, TimeUnit.MILLISECONDS,                     new ArrayBlockingQueue<Runnable>(500));          executor.execute(new Runnable() {                          @Override             public void run() {                 // TODO Auto-generated method stub                              }         });