[toc]
## 1、線程池的工作原理;

1、提交任務后,線程池先判斷線程數是否達到了核心線程數(corePoolSize)。如果未達到線程數,則創建核心線程處理任務;否則,就執行下一步;
2、接著線程池判斷任務隊列是否滿了。如果沒滿,則將任務添加到任務隊列中;否則,執行下一步;
3、接著因為任務隊列滿了,線程池就判斷線程數是否達到了最大線程數。如果未達到,則創建非核心線程處理任務;否則,就執行飽和策略,默認會拋出RejectedExecutionException異常。
> 創建非核心線程的優先級是最低的,因為其代價比較大。
## 2、CPU密集型和IO密集型的配置
### 非核心線程的消亡時間的設置,是怎么實現的?
1. 所有的線程都是一樣的,并沒有區分是核心線程還是非核心線程,只是在沒有任務的時候,過了超時時間會有一些線程結束執行退出,剩下的就是核心線程了。
2. runworker()方法里會通過while死循環獲取任務,當線程數量大于核心線程數量時,獲取任務為null時,會執行線程銷毀操作——線程是作為存放在HashSet<Worker>中的,執行remove()操作即可。`java/util/concurrent/ThreadPoolExecutor.java:1134`
```
final void runWorker(Worker w) {
Thread wt = Thread.currentThread();
Runnable task = w.firstTask;
w.firstTask = null;
w.unlock(); // allow interrupts
boolean completedAbruptly = true;
try {
while (task != null || (task = getTask()) != null) {
w.lock();
// 省略一部分代碼
}
completedAbruptly = false;
} finally {
processWorkerExit(w, completedAbruptly);
}
}
```
### 線程的復用機制是怎么實現的?
- 前言
- 第一部分 計算機網絡與操作系統
- 大量的 TIME_WAIT 狀態 TCP 連接,對業務有什么影響?怎么處理?
- 性能占用
- 第二部分 Java基礎
- 2-1 JVM
- JVM整體結構
- 方法區
- JVM的生命周期
- 堆對象結構
- 垃圾回收
- 調優案例
- 類加載機制
- 執行引擎
- 類文件結構
- 2-2 多線程
- 線程狀態
- 鎖與阻塞
- 悲觀鎖與樂觀鎖
- 阻塞隊列
- ConcurrentHashMap
- 線程池
- 線程框架
- 徹底搞懂AQS
- 2-3 Spring框架基礎
- Spring注解
- Spring IoC 和 AOP 的理解
- Spring工作原理
- 2-4 集合框架
- 死磕HashMap
- 第三部分 高級編程
- Socket與NIO
- 緩沖區
- Bybuffer
- BIO、NIO、AIO
- Netty的工作原理
- Netty高性能原因
- Rabbitmq
- mq消息可靠性是怎么保障的?
- 認證授權
- 第四部分 數據存儲
- 第1章 mysql篇
- MySQL主從一致性
- Mysql的數據組織方式
- Mysql性能優化
- 數據庫中的樂觀鎖與悲觀鎖
- 深度分頁
- 從一條SQL語句看Mysql的工作流程
- 第2章 Redis
- Redis緩存
- redis key過期策略
- 數據持久化
- 基于Redis分布式鎖的實現
- Redis高可用
- 第3章 Elasticsearch
- 全文查詢為什么快
- battle with mysql
- 第五部分 數據結構與算法
- 常見算法題
- 基于數組實現的一個隊列
- 第六部分 真實面試案例
- 初級開發面試材料
- 答案部分
- 現場編碼
- 第七部分 面試官角度
- 第八部分 計算機基礎
- 第九部分 微服務
- OpenFeign工作原理