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
|