一.項目中線程池的使用:java
參數配置:(application.yml配置文件中) spring
task: pool: corePoolSize: 10 maxPoolSize: 50 keepAliveSeconds: 300 queueCapacity: 1000
經過註解app
@Component @ConfigurationProperties(prefix = "spring.task.pool")
獲取配置文件的參數設置:線程
線程池配置:code
@EnableAsync @Configuration public class ThreadPoolConfig { @Autowired private ThreadPoolProperties poolConfig; //定義線程池(同理可拓展) @Bean public Executor testTaskAsyncPool() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(poolConfig.getCorePoolSize()); executor.setMaxPoolSize(poolConfig.getMaxPoolSize()); executor.setQueueCapacity(poolConfig.getQueueCapacity()); executor.setKeepAliveSeconds(poolConfig.getKeepAliveSeconds()); executor.setThreadNamePrefix("testExecutor-"); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.initialize(); return executor; } }
參數說明:接口
corePoolSize:核心線程數---10隊列
a.核心線程會一直存活,即便沒有任務執行也存活ci
b.當線程數少於核心線程數時,即便有空閒的線程,也會優先建立新的線程去處理。get
c.設置參數allowCoreThreadTimeout=true(默認false),核心線程會超時關閉。it
queueCapacity:任務隊列容量(阻塞隊列)---1000
a.當核心線程數達到最大時,新任務會放在隊列中排隊等待執行。
maxPoolSize:最大線程數---50
a.當線程數大於corePoolSize時,且任務隊列也已滿,線程池會建立新的線程處理任務。
b.當線程數=maxPoolSize,且任務隊列已滿,線程池會默認拋出異常拒絕執行任務。
keepAliveSeconds:線程空閒時間---300
a.當線程空閒時間達到這個設置時間時,線程會自動退出,直到線程數量=corePoolSize
b.若是allowCoreThreadTimeout=true,則會直到線程數量=0
rejectedExecutionHandler:任務拒絕處理器
a.兩種狀況會拒絕處理任務
1st.當線程數量已經達到maxPoolSize,且隊列已滿,就會拒絕新任務
2nd.當線程池被調用shutdown後,會等線程池裏任務執行完畢,再shutdown,若是在調用shutdown和線程池真正shutdown之間提交任務,會拒絕新任務。
b.線程池會調用rejectedExecutionHandler來處理任務,默認是AbortPolicy,拋出異常
c.ThreadPoolExecutor內部實現的方式:
c1.AbortPolicy 丟棄任務,拋運行時異常
c2.CallerRunsPolicy 執行任務
c3.DiscardPolicy 忽視,什麼都不會發生
c4.DiscardOldestPolicy 從隊列中踢出最早進入隊列(最後一個執行)的任務
d.也可實現RejectedExecutionHandler接口,自定義處理器
ThreadPoolExecutor執行順序:
1.當線程數小於核心線程數時,建立新線程
2.當線程數大於等於核心線程數時,且任務隊列未滿時,將任務放入任務隊列
3.當線程數大於核心線程數,且任務隊列已滿時,
a.若線程數少於最大線程數,建立線程
b.若線程數等於最大線程數,拋出異常,拒絕任務
二.線程池的使用:
經過註解的方式使用,在方法上添加註解
@Async("testTaskAsyncPool")
可在業務代碼的方法上直接調用便可。。。