Java 多線程 - 線程池常用的阻塞隊列有哪些


一、線程池對應的阻塞隊列

 

 

 

LinkedBlockingQueue

第一種阻塞隊列是 LinkedBlockingQueue,它的容量是 Integer.MAX_VALUE,為 231 -1 ,是一個非常大的值,可以認為是無界隊列。

FixedThreadPool 和 SingleThreadExecutor 線程池的線程數是固定的,所以沒有辦法增加特別多的線程來處理任務,這時就需要 LinkedBlockingQueue 這樣一個沒有容量限制的阻塞隊列來存放任務。

SynchronousQueue

如果不希望任務在隊列中等待而是希望將任務直接移交給工作線程,可使用SynchronousQueue作為等待隊列。SynchronousQueue不是一個真正的隊列,而是一種線程之間移交的機制。要將一個元素放入SynchronousQueue中,必須有另一個線程正在等待接收這個元素。只有在使用無界線程池或者有飽和策略時才建議使用該隊列。

 

DelayedWorkQueue

第三種阻塞隊列是DelayedWorkQueue,它對應的線程池分別是 ScheduledThreadPool 和 SingleThreadScheduledExecutor,這兩種線程池的最大特點就是可以延遲執行任務,比如說一定時間后執行任務或是每隔一定的時間執行一次任務。

DelayedWorkQueue 的特點是內部元素並不是按照放入的時間排序,而是會按照延遲的時間長短對任務進行排序,內部采用的是“堆”的數據結構(堆的應用之一就是 優先級隊列)。之所以線程池 ScheduledThreadPool 和 SingleThreadScheduledExecutor 選擇 DelayedWorkQueue,是因為它們本身正是基於時間執行任務的,而延遲隊列正好可以把任務按時間進行排序,方便任務的執行。

 

參考文獻

————————————————
版權聲明:本文為CSDN博主「不懂的浪漫」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/xiewenfeng520/article/details/106954169

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM