無意中發現了一個巨牛的人工智能教程,忍不住分享一下給大家。教程不僅是零基礎,通俗易懂,而且非常風趣幽默,像看小說一樣!覺得太牛了,所以分享給大家。點這裏可以跳轉到教程。
springboot2中線程池的定義
@Configuration
public class ThreadPoolConfig {
@Bean
public Executor logExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setThreadNamePrefix("myLog-");
executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors() << 1 + 1);
executor.setCorePoolSize(Runtime.getRuntime().availableProcessors());
return executor;
}
@Bean
public Executor bizExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setThreadNamePrefix("myBiz-");
executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors() << 1 + 1);
executor.setCorePoolSize(Runtime.getRuntime().availableProcessors());
return executor;
}
}
如上,定義了兩個線程池,線程池中線程名字的前綴自定義,設置了線程池大小和核心線程數,這裏其實可以繼續設置其它參數,入拒絕策略,線程池中任務隊列大小等
ThreadPoolTaskExecutor 這個類是springboot中的,其實它內部使用的也是ThreadPoolExecutor,大家自定義線程池也都是通過ThreadPoolExecutor來做的,所以都逃不掉這個類。
可以看到最終提交任務給線程池工作的時候也是通過JDK的ExecutorService去提交的。
異步執行
有了上面的基於springboot2的線程池自定義,那麼異步任務如何實現?
通過Async註解來標明該方法的異步執行,括號內的bizExecutor就是我們自定義線程池的方法名,表明該異步執行的任務通過哪個線程池來完成。
ThreadPoolExecutor原理
corePoolSize
線程池的核心線程數,最小線程數
maximumPoolSize
線程池中最大線程數
keepAliveTime
超過core數量的空閒線程的存活時間,超過則被銷燬
unit
時間單位
workQueue
阻塞隊列,用來保存等待執行的任務
threadFactory
線程工廠,創建線程時的自定義方法,比如線程名,定位問題方便查找
handler
線程池滿或隊列滿時的拒絕執行策略
整個線程池原型的原理總結如下: