1. 程式人生 > >spring 配置 執行緒池並使用 springtest 進行測試

spring 配置 執行緒池並使用 springtest 進行測試

 

 

在 applicationContext.xml 中配置spring執行緒池:

    <!-- 包路徑掃描 -->
    <context:component-scan base-package="spring.task"/>

    <!-- Spring執行緒池 -->
    <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <!--
核心執行緒數 --> <property name="corePoolSize" value="5" /> <!-- 執行緒池維護執行緒的最大數量 --> <property name="maxPoolSize" value="10" /> <!-- 允許的空閒時間, 預設60秒 --> <property name="keepAliveSeconds" value="60" /> <!-- 任務佇列 --> <
property name="queueCapacity" value="50" /> <!-- 執行緒超過空閒時間限制,均會退出直到執行緒數量為0 --> <property name="allowCoreThreadTimeOut" value="true"/> <!-- 對拒絕task的處理策略 --> <property name="rejectedExecutionHandler"> <bean class="java.util.concurrent.ThreadPoolExecutor.DiscardOldestPolicy"
/> </property> </bean>

 

 

當一個新任務來臨時:
1)如果此時執行緒池中的數量小於corePoolSize,即使執行緒池中的執行緒都處於空閒狀態,也要建立新的執行緒來處理被新增的任務;
2)如果此時執行緒池中的數量等於corePoolSize,但是緩衝佇列workQueue未滿,那麼任務被放入緩衝佇列;
3)如果此時執行緒池中的數量大於corePoolSize,緩衝佇列workQueue滿,並且執行緒池中的數量小於maxPoolSize,建新的執行緒來處理被新增的任務;
4)如果此時執行緒池中的數量大於corePoolSize,緩衝佇列workQueue滿,並且執行緒池中的數量等於maxPoolSize,那麼通過handler所指定的策略來處理此任務;
5)當執行緒池中的執行緒數量大於corePoolSize時,如果某執行緒空閒時間超過keepAliveTime,執行緒將被終止,如果allowCoreThreadTimeOut為false,則執行緒數量維持在corePoolSize, 如果為true,則執行緒數量可最低降至0;

 

 

下面是 springtest 的實現方式:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class AsyncTask {

    @Autowired
    private ThreadPoolTaskExecutor executor;

//    @PostConstruct 註解需要使用,否則不能成功看到輸出
    @PostConstruct
    public void testAsycTask() {
        for (int i = 0; i < 10; i++) {
            executor.execute(new Runnable() {
                public void run() {
                    asyncTask();
                }
            });
        }
    }

//    這裡需要設定為 public
    @Test
    public void asyncTask() {
        System.out.println("---" + Thread.currentThread().getName());
    }
}

 

成功: