內存資源很寶貴,線程池資源不宜過多的創建,同一個應用,盡量使用統一的線程池,並且相關參數需要設置適當,不造成資源的浪費,也不影響性能的提升。
import java.util.concurrent.ThreadPoolExecutor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
/**
* @author
* @date 2019/5/21
*/
@Configuration
public class ThreadPoolConfig {
@Value("thread.pool.core.pool.size:10")
private int threadPoolCorePoolSize;
@Value("thread.pool.max.pool.size:50")
private int threadPoolMaxPoolSize;
@Value("thread.pool.queue.capacity:50")
private int threadPoolQueueCapacity;
@Value("thread.pool.keep.alive.seconds:300")
private int threadPoolKeepAliveSeconds;
@Primary
@Bean
public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
/** 核心線程數,默認為1 **/
threadPoolTaskExecutor.setCorePoolSize(threadPoolCorePoolSize);
/** 最大線程數,默認為Integer.MAX_VALUE **/
threadPoolTaskExecutor.setMaxPoolSize(threadPoolMaxPoolSize);
/** 隊列最大長度,一般需要設置值: 大於等於notifyScheduledMainExecutor.maxNum;默認為Integer.MAX_VALUE **/
threadPoolTaskExecutor.setQueueCapacity(threadPoolQueueCapacity);
/** 線程池維護線程所允許的空閑時間,默認為60s **/
threadPoolTaskExecutor.setKeepAliveSeconds(threadPoolKeepAliveSeconds);
/**
* 線程池對拒絕任務(無線程可用)的處理策略,目前只支持AbortPolicy、CallerRunsPolicy;默認為后者
*
* AbortPolicy:直接拋出java.util.concurrent.RejectedExecutionException異常
* CallerRunsPolicy:主線程直接執行該任務,執行完之后嘗試添加下一個任務到線程池中,可以有效降低向線程池內添加任務的速度
* DiscardOldestPolicy:拋棄舊的任務、暫不支持;會導致被丟棄的任務無法再次被執行
* DiscardPolicy:拋棄當前任務、暫不支持;會導致被丟棄的任務無法再次被執行
*/
threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
return threadPoolTaskExecutor;
}
}
