內存資源很寶貴,線程池資源不宜過多的創建,同一個應用,盡量使用統一的線程池,並且相關參數需要設置適當,不造成資源的浪費,也不影響性能的提升。
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; } }