Java多线程之BlockingQueue

前言

BlcokingQueue本质上仍是一个Queue,只是额外支持当队列为空或者队列没有可用空间时支持线程等待操作。

相关方法

add():将一个对象添加到BlockingQueue中,如果可以容纳,返回true,否则抛出异常
offer():将一个对象添加到BlockingQueue中,如果可以容纳,返回true,否则返回false
put():将一个对象添加到BlockingQueue中,如果可以容纳,返回true,否则阻塞,直到有可用空间
remove():取出BlockingQueue中首位元素,若为空则抛出异常
poll():取出BlockingQueue中首位元素,若为空返回null
take():取出BlockingQueue中首位元素,若为空则阻塞,直到有新对象被加入
element():返回队列头部元素,如果队列为空,则抛出异常
peek():返回队列头部元素,如果队列为空,则返回null
drainTo():一次性从BlockingQueue获取所有可用的数据对象(还可以指定获取数据的个数)
其中remove、element、offer 、poll、peek 属于Queue接口

BlockingQueue成员介绍:

  • ArrayBlockingQueue
    1、基于数据实现的阻塞队列,内部维护一个定长数组,一旦创建,容量无法改变
    2、支持可选的公平性策略用于订购所选的生产者和消费者线程(公平性通常会降低吞吐),默认非公平锁
    3、内部维护两个整型变量用来标识队列的头部和尾部在数组中的位置
    4、对于生产者和消费者采用的是用一个锁控制数据同步
  • LinkedBlockingQueue
    1、对于生产者和消费者分别采用独立的锁来控制数据同步
    2、在构造LinkedBlockingQueue对象时,如果没有指定容量大小,默认采用Integer.MAX_VALUE(当生产者速度大于消费者速度时,可能会造成内存消耗殆尽)
    3、在插入或删除元素时会生成一个额外Node对象
  • DelayQueue
    DelayQueue是一个没有大小限制的队列,只有当其中的元素指定的延迟时间到了,才能够从队列中获取到该元素。因此往队列中插入数据的操作(生产者)永远不会被阻塞,而只有获取数据的操作(消费者)才会被阻塞。
    使用场景:DelayQueue使用场景较少,常见的例子比如使用一个DelayQueue来管理一个超时未响应的连接队列。
  • PriorityBlockingQueue
    基于优先级的阻塞队列(优先级的判断通过构造函数传入的Compator对象来决定),但需要注意的是PriorityBlockingQueue并不会阻塞数据生产者,而只会在没有可消费的数据时,阻塞数据的消费者。因此使用的时候要特别注意,生产者生产数据的速度绝对不能快于消费者消费数据的速度,否则时间一长,会最终耗尽所有的可用堆内存空间。在实现PriorityBlockingQueue时,内部控制线程同步的锁采用的是公平锁。
  • SynchronousQueue
    1、声明一个SynchronousQueue有两种不同的方式,它们之间有着不太一样的行为。公平模式和非公平模式的区别:
    公平模式:SynchronousQueue会采用公平锁,并配合一个FIFO队列来阻塞多余的生产者和消费者,从而体系整体的公平策略;
    非公平模式(SynchronousQueue默认):SynchronousQueue采用非公平锁,同时配合一个LIFO队列来管理多余的生产者和消费者,如果生产者和消费者的处理速度有差距,则很容易出现饥渴的情况,即可能有某些生产者或者是消费者的数据永远都得不到处理。

未完待续…

  • 只是接下来要学习多线程的知识,先总结一下BlockingQueue的相关知识,只是参考网上的资料简单总结了下BlockingQueue的相关方法和分类介绍,后续有待深入学习
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值