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 } });