[TOC]
<br/>
> ### 線程池實現原理


* `ThreadPoolExecutor`執行情況
* 1)如果當前運行的線程少于`corePoolSize`,則創建新線程來執行任務(注意,執行這一步驟需要獲取全局鎖)。
* 2)如果運行的線程等于或多于`corePoolSize`,則將任務加入`BlockingQueue`。
* 3)如果無法將任務加入`BlockingQueue`(隊列已滿),則創建新的線程來處理任務(注意,執行這一步驟需要獲取全局鎖)。
* 4)如果創建新線程將使當前運行的線程超出`maximumPoolSize`,任務將被拒絕,并調用`RejectedExecutionHandler.rejectedExecution()`方法。
<br/>
> ### 線程池參數
```
public ThreadPoolExecutor (int corePoolSize, //核心線程數
int maximumPoolSize, //線程池中允許的最大線程數
long keepAliveTime, //線程池中空閑線程所能允許的最長時間
TimeUnit unit, //時間單位
BlockingQueue<Runnable> workQueue, //任務的阻塞隊列
RejectedExecutionHandler handler) //線程池滿時對于提交任務的策略
```
<br/>
> ### 線程池滿時的拒絕策略`RejectedExecutionHandler `
* `AbortPolicy`:直接拋出異常(默認)。
* `CallerRunsPolicy`:只用調用者所在線程來運行任務。
* `DiscardOldestPolicy`:丟棄隊列里最近的一個任務,并執行當前任務。
* `DiscardPolicy`:不處理,丟棄掉。
<br/>
> ### 向線程池提交的任務類型
* `execute()`方法用于提交不需要返回值的任務,所以無法判斷任務是否被線程池執行成功。
* `submit()`方法用于提交需要返回值的任務。線程池會返回一個`future`類型的對象,通過這個`future`對象可以判斷任務是否執行成功,并且可以通過`future`的`get()`方法來獲取返回值,`get()`方法會阻塞當前線程直到任務完成。
<br/>
> ### `FixedThreadPool`
```
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
```
* `FixedThreadPool`固定線程數的線程池,`corePoolSize`和`maximumPoolSize`都被設置為創建`FixedThreadPool`時指定的參數`nThreads`。
* 當線程池中的線程數大于`corePoolSize`時,`keepAliveTime`為多余的空閑線程等待新任務的最長時間,超過這個時間后多余的線程將被終止。這里把`keepAliveTime`設置為0L,意味著多余的空閑線程會被立即終止。
* 使用`FixedThreadPool`時,`keepAliveTime`和`RejectedExecutionHandler`均無效。
* `FixedThreadPool`使用無界隊列`LinkedBlockingQueue`作為線程池的工作隊列,注意:當線程池中的線程阻塞時,新任務不斷的添加到無界隊列`LinkedBlockingQueue`中,任務的添加速度大于線程池的處理速度,任務隊列會越來越長,會造成內存被這個隊列撐滿。

> ### `SingleThreadExecutor`
```
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
```
* `SingleThreadExecutor`是使用單個`worker`線程的`Executor`。
* `SingleThreadExecutor`的`corePoolSize`和`maximumPoolSize`被設置為1。其他參數與`FixedThreadPool`相同。`SingleThreadExecutor`使用無界隊列`LinkedBlockingQueue`作為線程池的工作隊列。

> ### `CachedThreadPool`
```
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
```
* `CachedThreadPool`的`corePoolSize`被設置為0,即corePool為空;`maximumPoolSize`被設置為`Integer.MAX_VALUE`,即`maximumPool`是無界的。這里把`keepAliveTime`設置為60L,意味著`CachedThreadPool`中的空閑線程等待新任務的最長時間為60秒,空閑線程超過60秒后將會被終止。
* `CachedThreadPool`使用沒有容量的`SynchronousQueue`作為線程池的工作隊列,但`CachedThreadPool`的`maximumPool`是無界的。這意味著,如果主線程提交任務的速度高于`maximumPool`中線程處理任務的速度時,`CachedThreadPool`會不斷創建新線程。極端情況下,`CachedThreadPool`會因為創建過多線程而耗盡CPU和內存資源。

> ### ` ScheduledThreadPoolExecutor`
* `ScheduledThreadPoolExecutor`繼承自`ThreadPoolExecutor`。它主要用來在給定的延遲之后運行任務,或者定期執行任務。
* `DelayQueue`是一個無界隊列

- asD
- Java
- Java基礎
- Java編譯器
- 反射
- collection
- IO
- JDK
- HashMap
- ConcurrentHashMap
- LinkedHashMap
- TreeMap
- 阻塞隊列
- java語法
- String.format()
- JVM
- JVM內存、對象、類
- JVM GC
- JVM監控
- 多線程
- 基礎概念
- volatile
- synchronized
- wait_notify
- join
- lock
- ThreadLocal
- AQS
- 線程池
- Spring
- IOC
- 特性介紹
- getBean()
- creatBean()
- createBeanInstance()
- populateBean()
- AOP
- 基本概念
- Spring處理請求的過程
- 注解
- 微服務
- 服務注冊與發現
- etcd
- zk
- 大數據
- Java_spark
- 基礎知識
- Thrift
- hdfs
- 計算機網絡
- OSI七層模型
- HTTP
- SSL
- 數據庫
- Redis
- mysql
- mybatis
- sql
- 容器
- docker
- k8s
- nginx
- tomcat
- 數據結構/算法
- 排序算法
- 快排
- 插入排序
- 歸并排序
- 堆排序
- 計算時間復雜度
- leetcode
- LRU緩存
- B/B+ 樹
- 跳躍表
- 設計模式
- 單例模式
- 裝飾者模式
- 工廠模式
- 運維
- git
- 前端
- thymeleaf
- 其他
- 代碼規范
- work_project
- Interview