java.util.concurrent.ArrayBlockingQueue类

java.util.concurrent.ArrayBlockingQueue类


特点

  1. ArrayBlockingQueue线程安全有界阻塞FIFO队列 —— 队首元素是最老元素,队尾元素是最新元素;
  2. ArrayBlockingQueue一旦被创建,队列容量就不可改
  3. ArrayBlockingQueue不支持null元素;
  4. ArrayBlockingQueueiterator()迭代器从头到尾遍历元素;
  5. ArrayBlockingQueue支持可选的公平性策略 —— 当公平性被设置为true时,ArrayBlockingQueue按照FIFO顺序授予排队线程访问权

API

构造函数

  1. public ArrayBlockingQueue(int capacity)设置ArrayBlockingQueue的容量,一旦设置不可更改,默认非公平访问元素
  2. public ArrayBlockingQueue(int capacity, boolean fair)设置ArrayBlockingQueue的容量,一旦设置不可更改,如果fair == true为公平性访问元素,按照FIFO顺序授予派对线程访问权
  3. public ArrayBlockingQueue(int capacity, boolean fair, Collection c)从给定集合构建ArrayBlockingQueue,指定容量,一旦设置不可更改,如果fair == true为公平性访问元素,按照FIFO顺序授予派对线程访问权

其他

  1. void put(Object o)阻塞等待,队列非满时尾插

  2. boolean add(object)直接尾插,如果队列非满则返回true,否则抛出异常

  3. boolean offer(object):同add()

  4. boolean remove(object):移除元素;

  5. Object peek()查看队首但不删除,如果队列为空返回null

  6. Object poll()弹出队首,如果队列为空返回null

  7. Object poll(timeout, timeUnit)弹出队首,如果队列为空返回null,可用等待timeout的时间直到有元素可用

  8. Object take()阻塞弹出队首,直到有元素可用

    所以如果要使用PriorityBlockingQueueAQS特性需要用take(),而非poll()

  9. void clear():清空队列

  10. Comparator comparator():返回队列使用使用的Comparator

  11. boolean contains(Object o):是否包含某个元素

  12. Iterator iterator():返回队列使用的迭代器

  13. int size():队列元素个数

  14. int drainTo(Collection c)按照优先级顺序移除全部元素,并且尾插进另一个集合

  15. int drainTo(Collection c, int maxElements)按照优先级顺序移除maxElements个元素,并且尾插进另一个集合


Demo

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
41
42
43
//指定容量
ArrayBlockingQueue<Integer> abq = new ArrayBlockingQueue<Integer>(5);

//生产者
new Thread(() -> {
int i = 0;
try{
while (true) {
abq.put(++i);
System.out.println("ArrayBlockingQueue入队:" + i);
Thread.sleep(TimeUnit.SECONDS.toMillis(1));
}
}catch (InterruptedException e){
e.printStackTrace();
}
}).start();

//消费者:阻塞等待队列非空
new Thread(() -> {
int i = 0;
try{
while (true) {
Integer poll = abq.take();
System.out.println("ArrayBlockingQueue出队:" + poll);
Thread.sleep(TimeUnit.SECONDS.toMillis(2));
}
}catch (InterruptedException e){
e.printStackTrace();
}
}).start();

//输出:
//ArrayBlockingQueue入队:1
//ArrayBlockingQueue出队:1
//ArrayBlockingQueue入队:2
//ArrayBlockingQueue出队:2
//ArrayBlockingQueue入队:3
//ArrayBlockingQueue入队:4
//ArrayBlockingQueue出队:3
//ArrayBlockingQueue入队:5
//ArrayBlockingQueue入队:6
//ArrayBlockingQueue出队:4
//……
-------------本文结束感谢您的阅读-------------

本文标题:java.util.concurrent.ArrayBlockingQueue类

文章作者:DragonBaby308

发布时间:2019年09月17日 - 11:16

最后更新:2019年09月22日 - 10:10

原始链接:http://www.dragonbaby308.com/java-util-concurrent-ArrayBlockingQueue/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

急事可以使用右下角的DaoVoice,我绑定了微信会立即回复,否则还是推荐Valine留言喔( ఠൠఠ )ノ
0%