JMM——AQS之BlockingQueue队列

AQS之BlockingQueue队列

1.什么是BlockingQueue队列

BlockingQueue,是java.util.concurrent 包提供的用于解决并发生产者 - 消费者问题的最有用的类,它的特性是在任意时刻只有一个线程可以进行take或者put操作,并且BlockingQueue提供了超时return null的机制,在许多生产场景里都可以看到这个工具的身影。

2.BlockingQueue API 详解

在这里插入图片描述

2.1 入队API

1.add():将元素添加到队列中,如果成功返回true,如果失败抛出new IllegalStateException(“Queue full”);异常。
2.offer():将元素添加到队列中,如果成功返回true,如果失败返回false。
3.put():将元素添加到队列中,如果队列满了,会阻塞。直到有空间插入
4.offer(E e, long timeout, TimeUnit unit):将元素添加到队列中,如果队列满了,会阻塞。直到有空间插入,但是不能超时。超时返回false

2.2 出队API

1.take():获取队列的头部元素并将其删除,如果队列为空,会阻塞,只要队列中有值。
2.poll(long timeout, TimeUnit unit):获取头部元素并将其删除,如果队列中没有值,按照时间来尝试获取值,即如果是1秒,每1秒获取一次,如果获取不到返回null。
3.remove():移出头部的值,不获取。
4.remove(Object o):移出指定的值。

2.3 其他的API

1.remainingCapacity():返回队列当前的剩余容量
2.contains(Object o):判断队列中是否存在此值,存在返回true,不存在返回false。
3.drainTo(Collection<? super E> c); 将队列剩余的值,移出并添加到参数集合中。
4.drainTo(Collection<? super E> c, int maxElements);将队列中固定长度的值,移出并返回到集合中。

3.队列的数据结构

队列实质是一种存储数据的实现。通常用链表或者数组来实现。要满足FIFO先进先出的特性,当然也有双端队列(Deque),优先级队列。
在这里插入图片描述

4.队列类型

  1. 无限队列 (unbounded queue ) - 几乎可以无限增长
  2. 有限队列 ( bounded queue ) - 定义了最大容量

5. 常用实现类

ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。

LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。

PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。

DelayQueue:一个使用优先级队列实现的无界阻塞队列。

SynchronousQueue:一个不存储元素的阻塞队列。

LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。

LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值