### BlockingQueue
> 用于傳輸和保持提交的任務,使用該隊列與池大小進行交互
> 排隊有三種策略
#### SynchronousQueue
> **直接提交的隊列**
> 默認選項
> 將任務直接提交給線程處理,而不保持它,如果沒有空閑的進程,則嘗試創建新的進程,如已達到最大值,則執行拒絕策略
#### LinkedBlockingQueue
> **有界的任務隊列**
> 如有新的任務需要執行,如果線程池的實際線程數小于corePoolSize,則會優先創建新的線程,
> 若大于corePoolSize,則會將新任務加入等待隊列。
> 若隊列已滿,無法加入,在總線程數,不大于maximumPoolSize的前提下,創建新的進程執行任務,
> 若大于maximumPoolSize,則執行拒絕策略
#### ArrayBlockingQueue
> **無界的任務隊列**
> 除非資源耗盡,否則無界的任務隊列不存在任務入隊失敗的情況。
> 當有新的任務到來,系統的線程數小于corePoolSize時,線程池會產生新的線程執行任務
> 當系統的線程數達到corePoolSize后,會繼續增加。
> 若后續有新的任務加入,而又沒有空閑的線程資源,則任務直接進入等待隊列
> 若任務創建和處理的速度差異很大,無界隊列會保持快速增長,直到耗盡系統內存。
#### PriorityBlockingQueue
> **任務優先隊列**
> 可以控制任務的執行先后順序
*****
```[flow]
st=>start: 開始
e=>end: 結束
op1=>operation: 提交任務
op2=>operation: 加入隊列
op3=>operation: 分配線程執行
op4=>operation: 提交到線程池
op5=>operation: 等待執行
op6=>operation: 提交成功,分配線程執行
op7=>operation: 拒絕執行
cond1=>condition: 大于corePoolSize
?
cond2=>condition: 加入隊列失敗?
cond3=>condition: 小于maximumPoolSize?
st->op1->cond1(no)->op3->e
cond1(yes,right)->op2(right)->cond2(no)->op5->e
cond2(yes,right)->op4(right)->cond3(no)->op7->e
cond3(yes,right)->op6->e
```
- 虛擬機
- JVM內存結構
- JVM調優手段
- java對象生命周期
- 垃圾回收判斷對象死亡
- 垃圾回收算法
- 垃圾收集器
- JAVA基礎知識
- java事件機制
- java反射機制
- jvm創建對象
- java異常
- finally語句一定會執行嗎?
- 集合類介紹
- ArrayList
- LinkedList
- HashMap
- ConcurrentHashMap
- 多線程
- 為什么要使用線程池
- 線程死鎖
- 死鎖檢測和解除
- jstack
- jconsole
- 死鎖預防
- 常見線程池
- 線程池參數
- 工作隊列介紹
- 拒絕策略
- ThreadLocal
- CAS
- ReentrantLock
- AQS
- CountDownLatch
- Spring
- spring中bean的作用域
- REDIS
- redis數據結構
- redis hash實現
- redis rehash與hashmap擴容的區別
- Redis使用場景
- Redis為何這么快
- redis連接數不足導致錯誤
- 分布式
- 分布式事務
- ACID
- CAP
- BASE
- 事務隔離性
- 一致性哈希算法
- 負載均衡算法
- Hystrix 信號量和線程池隔離的差異
- Spring Cloud
- eureka
- MYSQL
- mysql優化經驗
- undo redo binlog
- web
- http協議
- http和https區別
- Cookie和session
- TCP三次握手、4次揮手
- TCP的time_wait和close_wait
- 算法問題
- 編輯距離算法
- MQ
- RabbitMq
- Kafka
- 安裝教程
- Win ELK安裝