阻塞佇列詳解
阻塞佇列主要分為以下7類:
ArrayBlockingQueue:一個由陣列結構組成的有界阻塞佇列。
LinkedBlockingQueue:一個由連結串列結構組成的有界(預設是無界的,可以自行設定和可重入鎖相似,預設是非公平鎖,但是可以進行設定)阻塞佇列。
PriorityBlockingQueue:一個支援優先順序排序的無界阻塞佇列。
DelayQueue:一個使用優先順序佇列實現的無界阻塞佇列
SynchronousQueue:一個不儲存元素的阻塞佇列。
LinkedTransfer:一個連結串列結構組成的無界阻塞佇列。
LinkedBlockingDeque:一個由連結串列結構組成的雙向阻塞佇列。
先說說什麼叫做阻塞佇列:阻塞佇列是一個支援兩個附加操作的佇列。這兩個附加的操作支援阻塞的插入和移除方法。
支援阻塞的插入方法:意思是當佇列滿時,佇列會阻塞插入元素的執行緒,知道佇列不滿。
支援阻塞的移除方法:意思是當佇列為空時,獲取元素的執行緒會等待佇列變為非空。
阻塞佇列常用於生產主管和消費者的場景。
其插入和移除操作的4種處理方式有,add(e)/remove(),offer(e)/poll(),put(e)/take,offer(e,time,unit)/poll(time,unit)。其中第一種會丟擲異常,第二種會返回特殊值,第三種會一直阻塞,第四種會超時退出。
這四種方法的實現原理是利用ReentrantLock以及其Condition等待佇列通知模式實現的。例如take方法如下所示:
以上7類阻塞佇列中有LinkedBlockingQueue,DelayQueue,SynchronousQueue被用在了執行緒池當中,其中LinkedBlockingQueue被使用在FixedThreadPool,SingleThreadExecutor中,SynchronousQueue被用在CachedThreadPool中,DelayQueue被使用在ScheduledThreadPoolExecutor中。