1. 程式人生 > >阻塞佇列詳解

阻塞佇列詳解

阻塞佇列主要分為以下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中。