阻塞队列及方法介绍

本文介绍了Java中的阻塞队列BlockingQueue,包括ArrayBlockingQueue、LinkedBlockingQueue、DelayQueue、PriorityBlockingQueue、SynchronousQueue、LinkedTransferQueue和LinkedBlockingDeque七大常见类型,详细阐述了它们的特点和应用场景。此外,还讨论了阻塞队列的核心方法,如插入、移除和检查操作,以及如何处理阻塞和超时情况。
摘要由CSDN通过智能技术生成

1.BlockingQueue简介

阻塞队列实际上就是个队列,只不过当队列里面东西是空的时候,当从队列中拿数据的时候会阻塞,当队列满了的时候,向队列中添加元素也会阻塞。当我不断取元素直到队列里的元素为空,会自动挂起线程,当我队列里面突然有元素了,会自动唤醒取元素的线程。这个阻塞队列的好处是我们不需要关心什么时候需要阻塞线程,什么时候需要唤醒线程,因为这一切BlockingQueue都一手给我包办了。

2.常见的BlockingQueue

2.1ArrayBlockingQueue

基于数组的阻塞队列实现,在其内部维护了一个定长的数组,以便存储缓存的对象,同时它里面还维护了两个整型变量,分别标识着队列的头部和尾部在数组中的位置。它在生产者放入数据和消费者获取数据,都是同时共用一个锁对象,由此意味着两者无法真正的并行。

2.2LinkedBlockingQueue

基于链表的阻塞队列,内部也维持了一个数据缓冲队列(该队列有一个链表组成),与ArrayBlockingQueue不同的是这个的最大容量是Integer.MAX_VALUE。而且他对于生产者和消费者端分别采用了独立的锁来控制同步,这意味着在高并发情况下生产者和消费者可以并行地操作队列中的数据。

2.3 DelayQueue

DelayQueue中的元素只有当其指定的延迟时间到了,才能够从队列中获取到元素,他没有大小限制因此生产者永远不会阻塞。而且使用优先级队列实现延迟。

2.4PriorityBlockingQueue

他是一个支持优先级排序的无界阻塞序列,他也不会阻塞生产者,只会阻塞消费者,但是生产者生产的速度绝对不会快于消费者消费的速度,否则时间一长,会最终耗尽所有可用的堆空间。

2.5SynchronousQueue

一种无缓冲的等待队列,类似于无中介的直接交易,生产者生产好了之后必须得等消费者消费,如果没有消费者消费他就会一直等待,对于消费者来说也是这样。

2.6LinkedTransferQueue

LinkedTransferQueue是一个由链表构成的无界阻塞TransferQueue队列。相对于其他阻塞队列,LinkedTransferQueue多了tryTransfer和transfer方法。LinkedTransferQueue采用一种预占模式。

  • 队列不为空,直接取走数据
  • 队列为空,那就生成一个节点元素为null的入队,然后消费者线程在这等待
  • 如果生产者线程发现有一个null节点在队列上,生产者线程就不入队了直接将元素填充到该节点,并唤醒消费者线程取走元素,从调用的方法返回。

2.7LinkedBlockingDeque

LinkedBlockingDeque是一个由链表组成的双向阻塞队列,即可以从队列的两端插入和移除元素。还有一个特点就是可以设置超时时间参数,超时后返回false表示操作失败,也可以不设置超时参数一直阻塞,中断之后抛出InterruptedException异常。读元素时同样可以设置超时参数。

3.阻塞队列核心方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

温JZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值