一,環境 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);
}
}
}
}
}