适用于并发场景下,生产者生产的速度要大于消费者的速度,我觉得和分布式队列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); 一次性从队列中批量获取所有可用数据队列。