spring 配置線程池
阿新 • • 發佈:2019-01-26
framework 退出 cte eject frame pool lsi true 支持 一,環境 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); } } } } }
spring 配置線程池