spring 配置線程池

一,環境 spring mvc 4.3.10

二,spring配置文件

    <bean id="taskExecutor"
        class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <property name="corePoolSize" value="4" />
        <property name="maxPoolSize" value="40" />
        <property name="queueCapacity" value="200" />
        <!-- 線程池維護線程所允許的空閒時間 -->
        <property name="keepAliveSeconds" value="300" />
        <property name="rejectedExecutionHandler">
            <!-- AbortPolicy:直接拋出java.util.concurrent.RejectedExecutionException異常 -->
            <!-- CallerRunsPolicy:主線程直接執行該任務,執行完之後嘗試添加下一個任務到線程池中,可以有效降低向線程池內添加任務的速度 -->
            <!-- DiscardOldestPolicy:拋棄舊的任務、暫不支持;會導致被丟棄的任務無法再次被執行 -->
            <!-- DiscardPolicy:拋棄當前任務、暫不支持;會導致被丟棄的任務無法再次被執行 -->
            <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
        </property>
    </bean>

三,使用方法

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

public class Test {
    @Autowired
    private ThreadPoolTaskExecutor taskExecutor;

    /**
     * @功能:安全使用線程池
     * @param thread
     */
    public void excuteThread(Runnable thread) {
        int maxPoolSize = taskExecutor.getMaxPoolSize();
        while (true) {
            // 線程池中當前運行的線程數
            int activeCount = taskExecutor.getActiveCount();
            log.info("==========>>線程池中activeCount=" + activeCount
                    + ",maxPoolSize=" + maxPoolSize);
            // 如果已經到了最大的線程運行數則停止運行線程等待線程執行完畢
            if (activeCount >= maxPoolSize) {
                try {
                    log.error("==========>>線程池中activeCount=" + activeCount
                            + ",maxPoolSize=" + maxPoolSize
                            + ",運行線程數超過最大線程數,線程等待......");
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    log.error("", e);
                }
            } else {
                break;
            }
        }

        // 最多嘗試次數
        int maxTryCount = 3;
        // 防止線程池滿了出現異常
        for (int i = 0; i <= maxTryCount; i++) {
            try {
                // 開線程處理
                taskExecutor.execute(thread);
                // 線程池使用正常退出循環
                break;
            } catch (Exception e) {
                // 超過最多的嘗試次數則退出
                if (i == maxTryCount) {
                    break;
                }
                log.error("線程池獲取線程異常,第" + (i + 1) + "次嘗試,最多嘗試" + maxTryCount
                        + ",如超過最多的嘗試次數則退出執行。", e);
                try {
                    // 出現異常等待2秒鐘再次嘗試
                    Thread.sleep(2000);
                } catch (Exception e2) {
                    log.error("", e);
                }
            }
        }
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章