二、线程安全阻塞队列 BlockingQueue 入门

BlockingQueue是Java并发编程的重要组件,它继承Queue接口,提供线程安全的数据交互。常见实现包括ArrayBlockingQueue、LinkedBlockingQueue、DelayQueue、PriorityBlockingQueue、SynchronousQueue和BlockingDeque等。每个实现都有其特定的特性,如ArrayBlockingQueue是固定大小的有界队列,LinkedBlockingQueue是无界的,DelayQueue支持延迟取出,PriorityBlockingQueue是基于优先级的无界队列,SynchronousQueue是一个特殊的零容量队列。 BlockingQueue常用于生产者-消费者模型,确保线程间的同步和数据一致性。
摘要由CSDN通过智能技术生成


【继承关系】

java.util.concurrent 包里的 BlockingQueue是一个接口, 继承Queue接口,Queue接口继承 Collection

BlockingQueue --> Queue –-> Collection

图:

队列的特点是:先进先出(FIFO—first in first out)


【常用方法】

往队列中添加元素:  offer()、add()、 put()
从队列中取出或者删除元素: remove(),、peek()、element() 、 poll()、take()

每个方法的说明如下:

// 1.往队列中添加元素:
offer()方法:往队列添加元素如果队列已满直接返回false,队列未满则直接插入并返回true;

add()方法:对offer()方法的简单封装.如果队列已满,抛出异常new illegalStateException("Queue full");

put()方法:往队列里插入元素,如果队列已经满,则会一直等待直到队列中出现空位插入新元素,或者线程被中断抛出异常.

// 2.从队列中取出或者删除元素:
remove()方法:直接删除队头的元素:

peek()方法:直接取出队头的元素,并不删除.

element()方法:对peek方法进行简单封装,如果队头元素存在则取出并不删除,如果不存在抛出异常NoSuchElementException()

poll()方法:取出并删除队头的元素,当队列为空,返回null;

take()方法:取出并删除队头的元素,当队列为空,则会一直等待直到队列有新元素可以取出,或者线程被中断抛出异常

offer()方法一般跟poll()方法相对应;
put()方法一般跟take()方法相对应;
日常开发过程中 offer()pool() 方法用的相对比较频繁


【实现类】

队列 有界性 数据结构
ArrayBlockingQueue bounded(有界) 加锁 arrayList
LinkedBlockingQueue optionally-bounded 加锁 linkedList
PriorityBlockingQueue unbounded 加锁 heap
DelayQueue unbounded 加锁 heap
SynchronousQueue bounded 加锁
LinkedTransferQueue unbounded 加锁 heap
LinkedBlockingDeque unbounded 无锁 heap

【实现类详解】

【ArrayBlockingQueue】

一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列获取操作则是从队列头部开始获得元素。

这是一个典型的“有界缓存区”,固定大小的数组在其中保持生产者插入的元素和使用者提取的元素。一旦创建了这样的缓存区,就不能再增加其容量。试图向已满队列中放入元素会导致操作受阻塞;试图从空队列中提取元素将导致类似阻塞。

此类支持对等待的生产者线程和使用者线程进行排序的可选公平策略。默认情况下,不保证是这种排序。然而,通过将公平性 (fairness) 设置为 true 而构造的队列允许按照 FIFO 顺序访问线程。公平性通常会降低吞吐量,但也减少了可变性和避免了“不平衡性”

BlockingQueue queue = new ArrayBlockingQueue(1024);
queue.put("1");
String string = queue.take();

【LinkedBlockingQueue】

LinkedBlockingQueue 类实现了 BlockingQueue 接口。

LinkedBlockingQueue 内部以一个链式结构(链接节点)对其元素进行存储。如果需要的话,这一链式结构可以选择一个上限。如果没有定义上限,将使用 Integer.MAX_VALUE 作为上限。

LinkedBlockingQueue 内部以 FIFO(先进先出)的顺序对元素进行存储。队列中的头元素在所有元素之中是放入时间最久的那个,而尾元素则是最短的那个。

BlockingQueue unbounded = new LinkedBlockingQueue()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值