線程池可以廣泛的應用于同步或者異步處理的場景中,線程池主要的核心思想是能夠幫助我們將`任務的提交`和任務的`執行`分離開來,在JVM的線程和操作系統的線程之間又多封裝了一層(主要用Executor框架實現)。讓開發人員不用顯示的去創建線程(阿里開發手冊就明確說明不能手動創建線程!)
使用線程池帶來的三個好處:
1. 降低資源消耗:可以重復利用創建的線程來執行任務。
2. 提高響應速度:當有大量的任務到達時,可以立刻處理任務,而不用等到線程創建才被執行(并不一定,還是得看具體的線程池的實現細節和任務量)。
3. 提高線程的可管理性。
當向一個線程池提交一個任務(Task)之后,其處理流程如下:

主要概念:
1. 核心線程池:在創建線程池的時候會讓我們設置核心線程池中允許的線程數量的大小,線程池優先使用核心線程處理任務。
2. 工作隊列:用來存放要執行的任務,線程池中的線程可以從工作隊列中獲取任務來執行。
3. 飽和策略:當工作隊列和線程池運行的最大線程都已經滿的時候,證明線程池無法再處理更多的任務了,此時需要制定一些策略來對新到來的數據進行處理。
其創建流程如下:
1. 對于一個新添加的任務,當核心線程沒有滿的時候,創建新的核心線程來執行該任務。(會阻塞獲取全局鎖)
2. 當核心線程已滿的時候,將嘗試將任務放入阻塞隊列中。
3. 如果阻塞隊列已滿,如果當前線程池中的線程數還沒有到達最大線程數,則會創建新的線程執行任務。
4. 如果線程數達到最大線程數,則會觸發拒絕策略。根據不同的拒絕策略對任務進行處理。
### 線程池的創建
Java中使用ThreadPoolExecutor類來表示一個線程池:
```java
new ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory,
RejectedExecutionHandler handler
);
```
參數的含義:
1. corePoolSize:核心線程池的大小,當提交一個任務的時候,核心線程池會創建一個線程來執行任務;即使是核心線程池中有空閑的線程也會創建新的線程,直到任務的數量大于corePoolSize。如果要提前創建所有的線程可以使用:prestartAllCoreThread();
2. maximunPoolSize:線程池允許的最大線程數量(包括核心線程數)。如果工作隊列已經滿了,并且已經創建的線程數量小于該值,線程池就會創建新的線程對象。`設置了無界的工作隊列,該參數就不起作用了。`
3. keepAliveTime:線程空閑時的存活時間,如果任務時間比較短可以設置大一點。
4. unit:存活時間單位。
5. workQueue:工作隊列,用于保存等待執行的任務的阻塞隊列,所謂阻塞隊列就是獲取或者添加數據的時候可能進行阻塞,有如下幾種可以選擇:
* ArrayBlockingQueue:數組結構的`有界`隊列,按照先進先出的方式工作。
* LinkedBlockingQueue:鏈表結構的*無界*隊列(最大值為Integer.MAX\_VALUE),按照先進先出的方式工作,吞吐量要大于ArrayBlockingQueue,Executors.newFixedThreadPool()就是使用這個結構。也可以設定邊界。
* SynchronousQueue:不存儲元素的阻塞隊列,插入操作必須等到另一個線程執行移除操作。吞吐量要大于LinkedBlockingQueue。Executors.newCachedThreadPool使用了這個隊列。
* PriorityBlockingQueue:具有優先級的無限阻塞隊列。
6. threadFactory:用于設置創建線程的工廠,可以讓創建出來的線程的名字更有意義。
7. handler 飽和策略:
- AbortPolicy:直接拋出異常;
- CallerRunsPolicy:只用調用者所在的線程來運行任務;
- DiscardOldPolicy:丟棄隊列里最近一個任務,并執行當前任務;
- DiscardPolicy:不處理,丟棄掉。
### Executor框架
在Java中的線程即是工作單元,也是執行機制,在JDK5.0之后將工作單元和執行機制分離開來。工作單元由Runnable和Callable接口表征,執行機制由Executor框架提供。
Executor框架的結構:
1. 需要執行的任務:由Runnable和Callable接口提供。
2. 任務的執行:由Executor接口的關鍵實現類ThreadPoolExecutor和ScheduledThreadPoolExecutor(即線程池)提供。其中ScheduledThreadPoolExecutor可以在給定的延遲后執行命令,或者定期執行,功能比Timer靈活強大。
3. 異步計算結果:由Future和FutureTask提供。
4. 工廠類:Executors。
通過Executos工具類可以創建三種類型的ThreadPoolExecutor,分別為:
1. 可重用固定線程數的線程池:FixedThreadPool
~~~
?public static ExecutorService newFixedThreadPool(int nThreads) {
? ? ?return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? new LinkedBlockingQueue<Runnable>());
?}
~~~
特點:
* 核心線程數和最大線程數相同,為指定的參數nThreads。
* 線程空閑就會被終止。
* 使用LinkedBlockingQueue阻塞無界的阻塞隊列。
* 不用調用拒絕策略(隊列無界)。
2. 使用單個worker線程的線程池:SingleThreadExecutor
~~~
?public staitc ExecutorService newSingleThreadExecutor() {
? ? ?return new FinalizableDelegatedExecutorService(
? ? new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?new LinkedBlockingQueue<Runnable>()));
?}
~~~
特點:
* 只有一個線程。
* 線程空閑就會被終止。
* 使用LinkedBlockingQueue無界隊列。
* 不會調用拒絕策略。
3. 根據需要創建線程的線程池:CachedThreadPool
~~~
?public static ExecutorService newCachedThreadPool() {
? ? ?return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? new SynchronousQueue<Runnable>());
?}
~~~
特點:
* 核心線程數為0,最大線程數為整型的最大值。
* 空閑關閉時間為60s。
* 使用沒有長度的阻塞隊列SynchronousQueue。
- 第一章 Java基礎
- ThreadLocal
- Java異常體系
- Java集合框架
- List接口及其實現類
- Queue接口及其實現類
- Set接口及其實現類
- Map接口及其實現類
- JDK1.8新特性
- Lambda表達式
- 常用函數式接口
- stream流
- 面試
- 第二章 Java虛擬機
- 第一節、運行時數據區
- 第二節、垃圾回收
- 第三節、類加載機制
- 第四節、類文件與字節碼指令
- 第五節、語法糖
- 第六節、運行期優化
- 面試常見問題
- 第三章 并發編程
- 第一節、Java中的線程
- 第二節、Java中的鎖
- 第三節、線程池
- 第四節、并發工具類
- AQS
- 第四章 網絡編程
- WebSocket協議
- Netty
- Netty入門
- Netty-自定義協議
- 面試題
- IO
- 網絡IO模型
- 第五章 操作系統
- IO
- 文件系統的相關概念
- Java幾種文件讀寫方式性能對比
- Socket
- 內存管理
- 進程、線程、協程
- IO模型的演化過程
- 第六章 計算機網絡
- 第七章 消息隊列
- RabbitMQ
- 第八章 開發框架
- Spring
- Spring事務
- Spring MVC
- Spring Boot
- Mybatis
- Mybatis-Plus
- Shiro
- 第九章 數據庫
- Mysql
- Mysql中的索引
- Mysql中的鎖
- 面試常見問題
- Mysql中的日志
- InnoDB存儲引擎
- 事務
- Redis
- redis的數據類型
- redis數據結構
- Redis主從復制
- 哨兵模式
- 面試題
- Spring Boot整合Lettuce+Redisson實現布隆過濾器
- 集群
- Redis網絡IO模型
- 第十章 設計模式
- 設計模式-七大原則
- 設計模式-單例模式
- 設計模式-備忘錄模式
- 設計模式-原型模式
- 設計模式-責任鏈模式
- 設計模式-過濾模式
- 設計模式-觀察者模式
- 設計模式-工廠方法模式
- 設計模式-抽象工廠模式
- 設計模式-代理模式
- 第十一章 后端開發常用工具、庫
- Docker
- Docker安裝Mysql
- 第十二章 中間件
- ZooKeeper