java 阻塞队列 LinkedBlockingQueue ArrayBlockingQueue 分析
BlockingQueue是阻塞隊列接口類,該接口繼承了Queue接口
BlockingQueue實現類常見的有以下幾種。
ArrayBlockingQueue:ArrayBlockingQueue 是一個有界的阻塞隊列,其內部實現是將對象放到一個數組里。有界也就意味著,它不能夠存儲無限多數量的元素。它有一個同一時間能夠存儲元素數量的上限。你可以在對其初始化的時候設定這個上限,但之后就無法對這個上限進行修改了(譯者注:因為它是基于數組實現的,也就具有數組的特性:一旦初始化,大小就無法修改)。
DelayQueue:DelayQueue 對元素進行持有直到一個特定的延遲到期。注入其中的元素必須實現 java.util.concurrent.Delayed 接口。
LinkedBlockingQueue:LinkedBlockingQueue 內部以一個鏈式結構(鏈接節點)對其元素進行存儲。如果需要的話,這一鏈式結構可以選擇一個上限。如果沒有定義上限,將使用 Integer.MAX_VALUE 作為上限
PriorityBlockingQueue:PriorityBlockingQueue 是一個無界的并發隊列。它使用了和類 java.util.PriorityQueue 一樣的排序規則。你無法向這個隊列中插入 null 值。所有插入到 PriorityBlockingQueue 的元素必須實現 java.lang.Comparable 接口。因此該隊列中元素的排序就取決于你自己的 Comparable 實現
SynchronousQueue:SynchronousQueue 是一個特殊的隊列,它的內部同時只能夠容納單個元素。如果該隊列已有一元素的話,試圖向隊列中插入一個新元素的線程將會阻塞,直到另一個線程將該元素從隊列中抽走。同樣,如果該隊列為空,試圖向隊列中抽取一個元素的線程將會阻塞,直到另一個線程向隊列中插入了一條新的元素。
BlockingQueue接口提供了
3個添加元素方法
add:添加元素到隊列里,添加成功返回true,由于容量滿了添加失敗會拋出IllegalStateException異常
offer:添加元素到隊列里,添加成功返回true,添加失敗返回false
put:添加元素到隊列里,如果容量滿了會阻塞直到容量不滿
3個刪除方法。
poll:刪除隊列頭部元素,如果隊列為空,返回null。否則返回元素。
remove:基于對象找到對應的元素,并刪除。刪除成功返回true,否則返回false
take:刪除隊列頭部元素,如果隊列為空,一直阻塞到隊列有元素并刪除
例子:生產者和消費者非常適合阻塞隊列,其實我也弄過redis作為生產者和消費者模式,redis的list非常適合做隊列,生產者放入隊列和消費者從隊列里取出,同時也提供阻塞的取出等。先回歸到java的阻塞隊列里,用LinkedBlockingQueue來做這個例子。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
總結
以上是生活随笔為你收集整理的java 阻塞队列 LinkedBlockingQueue ArrayBlockingQueue 分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: rsync定时加脚本实现本地到阿里的ft
- 下一篇: nRF5 SDK for Mesh(一)