并发编程-阻塞队列

适用于并发场景下,生产者生产的速度要大于消费者的速度,我觉得和分布式队列MQ、和kaffak这些不同的是,分布式队列处理是多个服务,多个系统的这种消费业务(多进程),而阻塞队列处理的是内部程序(线程),而且MQ使用的是计算机内存,阻塞队列使用的是JVM内存。

(有一个场景就是在处理从库里面查大量数据,然后进行统计计算的时候)

消费者阻塞: 在队列为空时,消费者端的线程都会被自动阻塞,知道数据放入队列,消费者线程会诶自动唤醒并消费数据。

生产者阻塞:在队列已满且没有可用空间时,生产者端的线程都会被自动阻塞,知道队列中有空位置腾出来,线程会被自动唤醒并生产数据。

JDK 提供了7个阻塞队列

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

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

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

DelayQueue: 一个支持延时获取元素支持优先级队列实现的无界阻塞队列。

SynchronosQueue: 一个不存储元素的阻塞队列(存进去的数据被拿走了才能继续存,高吞吐量)

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

LinkedBlockingDeque: 一个由链表结构组成的双向阻塞队列(链表两端双向插入和移除数据)。

继承自AbstractQueue

有4存,4取8个方法

add(E e); 队列中有空间时则返回true,如果没有就报异常

offer(E e); 如果有空间就返回true,如果没有就返回false;

offer(E e,long timeount,TimeUnit unit); 如果没有空间就等待响应的时长,再没有就返回false

put(E e) 如果没有空间就阻塞等待,直到有空间。

取数据:

Poll() 取走队首对象如果没有就返回null;

Poll(long timeout,TimeUnit unit); 如果没有数据就等待

Take() 取队列队首数据,如果队列为空,则进入阻塞状态。

DrainTo(Collection collection); 一次性从队列中批量获取所有可用数据队列。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值