## 任務阻塞隊列

**它一般分為直接提交隊列、有界任務隊列、無界任務隊列、優先任務隊列;**
### SynchronousQueue
1、**直接提交隊列**:設置為`SynchronousQueue`隊列,`SynchronousQueue`是一個特殊的`BlockingQueue`,它沒有容量,每執行一個插入操作就會阻塞,需要再執行一個刪除操作才會被喚醒,反之每一個刪除操作也都要等待對應的插入操作。
使用`SynchronousQueue`隊列,提交的任務不會被保存,總是會馬上提交執行。如果用于執行任務的線程數量小于`maximumPoolSize`,則嘗試創建新的進程,如果達到`maximumPoolSize`設置的最大值,則根據你設置的`handler`執行拒絕策略。因此這種方式你提交的任務不會被緩存起來,而是會被馬上執行,在這種情況下,你需要對你程序的并發量有個準確的評估,才能設置合適的`maximumPoolSize`數量,否則很容易就會執行拒絕策略;
### ArrayBlockingQueue
2、**有界的任務隊列**:有界的任務隊列可以使用`ArrayBlockingQueue`實現,如下所示:
```
pool = new ThreadPoolExecutor(1, 2, 1000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
```
使用`ArrayBlockingQueue`有界任務隊列,若有新的任務需要執行時,線程池會創建新的線程,直到創建的線程數量達到`corePoolSize`時,則會將新的任務加入到等待隊列中。若等待隊列已滿,即超過`ArrayBlockingQueue`初始化的容量,則繼續創建線程,直到線程數量達到`maximumPoolSize`設置的最大線程數量,若大于`maximumPoolSize`,則執行拒絕策略。在這種情況下,線程數量的上限與有界任務隊列的狀態有直接關系,如果有界隊列初始容量較大或者沒有達到超負荷的狀態,線程數將一直維持在`corePoolSiz`e以下,反之當任務隊列已滿時,則會以`maximumPoolSize`為最大線程數上限。
### LinkedBlockingQueue
3、**無界的任務隊列**:無界任務隊列可以使用`LinkedBlockingQueue`實現,如下所示:
```
pool = new ThreadPoolExecutor(1, 2, 1000, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
```
使用無界任務隊列,線程池的任務隊列可以無限制的添加新的任務,而線程池創建的最大線程數量就是你`corePoolSize`設置的數量,也就是說在這種情況下`maximumPoolSize`這個參數是無效的,哪怕你的任務隊列中緩存了很多未執行的任務,當線程池的線程數達到`corePoolSize`后,就不會再增加了;若后續有新的任務加入,則直接進入隊列等待,當使用這種任務隊列模式時,一定要注意你任務提交與處理之間的協調與控制,不然會出現隊列中的任務由于無法及時處理導致一直增長,直到最后資源耗盡的問題。
### PriorityBlockingQueue
4、**優先任務隊列**:優先任務隊列通過`PriorityBlockingQueue`實現:
任務會按優先級重新排列執行,且線程池的線程數一直為`corePoolSize`,也就是只有一個。
`PriorityBlockingQueue`其實是一個特殊的無界隊列,它其中無論添加了多少個任務,線程池創建的線程數也不會超過`corePoolSize`的數量,只不過其他隊列一般是按照先進先出的規則處理任務,而`PriorityBlockingQueue`隊列可以自定義規則根據任務的優先級順序先后執行。
其實`LinkedBlockingQueue`也是可以設置界限的,它默認的界限是`Integer.MAX_VALUE`。同時也支持也支持構造的時候設置隊列大小。
- 寫在前面的話
- Java
- 基礎
- Double的比較
- 小數怎么用二進制表示
- 多線程
- 并發和并行
- 線程池
- 線程池背景
- 線程池構造
- 任務阻塞隊列
- Flutter
- 基礎知識
- Dart基礎
- Android
- 項目架構
- View
- 非UI線程更新View
- AlarmManager
- 對比postDelaryed和Timer
- Bitmap
- 加載100M的圖片卻不撐爆內存
- Bitmap壓縮
- Bitmap局部解碼
- 計算圖片的內存占用
- Android動畫
- Android動畫類型
- Android動畫原理
- 屬性動畫
- 幀動畫
- 補間動畫
- 使用動畫的注意事項
- Android新特性
- 權限組
- Android23(Marshmallow)-6.0
- Android24(Nougat)-7.0
- Android26(Oreo)-8.0
- Android28(Pie)-9.0
- Android29(Q)-10.0
- AndroidX遷移
- Kotlin
- 關鍵字
- Kotlin操作符
- CoroutineScope
- Flow
- CoroutineException