# 線程池入門到精通
## 什么是線程池
* 復用創建好的線程,節約創建和銷毀的時間。
* 需要使用線程時,就從池子里拿一個空閑的線程,完成工作后,歸還線程給線程池。
## 線程池工作原理

## 線程池工作流程

## 線程池生命周期及擴展點

## 線程池參數

## JDK提供的線程池

## 線程池常見阻塞隊列

## 線程池內置拒絕策略

## 線程池核心線程數設置

## Fork/Join框架
### 執行邏輯

### 竊取原理

### 任務類圖

### 例子
求開始數到結束數的和。
~~~
package org.mango.demo.mt.thread;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
/**
* 遞歸任務,帶返回值的
* @Author: mango
* @Date: 2022/6/27 10:18 下午
*/
public class SumTask extends RecursiveTask<Long> implements Callable<Long> {
// 臨界值
private static final int THRESHOLD = 10000;
private long start;
private long end;
public SumTask(long start,long end){
this.start = start;
this.end = end;
}
@Override
protected Long compute() {
long sum = 0L;
boolean canSum = (end-start) < THRESHOLD;
if(canSum){
for(long i=start;i<=end;i++){
sum += i;
}
}else{
// 分成100個小任務
int count = 100;
long step = (end-start)/count;
List<SumTask> sumTasks = new ArrayList<>();
// 游標
long cursor = start;
for(int i=0;i<count;i++){
long theEnd = cursor + step;
if(theEnd > end){
theEnd = end;
}
SumTask sumTask = new SumTask(cursor,theEnd);
// 游標下移動
cursor += step + 1;
// 將任務加入集合,并開啟子任務
sumTasks.add(sumTask);
sumTask.fork();
}
// 合并子任務結果
for (SumTask sumTask : sumTasks){
sum += sumTask.join();
}
}
return sum;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
ForkJoinPool forkJoinPool = new ForkJoinPool();
SumTask sumTask = new SumTask(1,123456789L);
Long result = forkJoinPool.invoke(sumTask);
System.out.println("結果為:"+result);
// ForkJoinTask<Long> forkJoinTask = forkJoinPool.submit(sumTask);
// try {
// Long result2 = forkJoinTask.get();
// } catch (InterruptedException e) {
// e.printStackTrace();
// } catch (ExecutionException e) {
// e.printStackTrace();
// }
ExecutorService executorService = Executors.newWorkStealingPool();
Future<Long> t = executorService.submit(sumTask);
Long result2 = t.get();
System.out.println(result2);
}
@Override
public Long call() throws Exception {
return compute();
}
}
~~~
## 參考文檔
* https://www.zhihu.com/question/41134816
* 書籍:葛一鳴 *《Java高并發程序設計第二版》
- 面試突擊
- Java虛擬機
- 認識字節碼
- 000Java發展歷史
- 000Macos10.15.7上編譯OpenJDK8u
- 001熟悉Java內存區域
- 002熟悉HotSpot中的對象
- 003Java如何計算對象大小
- 004垃圾判定算法與4大引用
- 005回收堆和方法區中對象
- 006垃圾收集算法
- 007HotSpot虛擬機垃圾算法實現篇1
- 007HotSpot虛擬機垃圾算法實現篇2
- 007HotSpot虛擬機垃圾算法實現篇3
- 008垃圾收集器
- 009內存分配與回收策略
- 010Java虛擬機相關工具
- 011調優案例分析
- 012一次IDEA的啟動速度調優
- 013類文件Class的結構
- 014熟悉字節碼指令
- 015類加載機制(過程)
- 016類加載器
- IDEA的JVM參數
- Java基礎
- Java自動裝箱與拆箱
- Java基礎數據類型
- Java方法的參數傳遞
- Java并發
- 001走入并行的世界
- 002并行程序基礎
- 003熟悉Java內存模型JMM
- 004Java并發之volatile關鍵字
- 005線程池入門到精通
- 006Java多線程間的同步控制方法
- 007Java維基準測試框架JMH
- 008Java并發容器
- 009Java的線程實現
- 010Java關鍵字synchronized
- 011一些并行模式的熟悉
- 單例模式和不變模式
- 生產者消費者模式
- Future模式
- 012一些并行算法的熟悉
- 面試總結
- 長亮一面