购书网站开发,网站原创页面,网站建设 常州,最有性价比的网站建设文章目录 1、阻塞队列概述2、阻塞队列分类3、 阻塞队列的四组核心方法4、Demo 队列#xff0c;先进先出#xff0c;类似排队栈#xff0c;先进后出#xff0c;用于要优先处理最近发生的事件的场景
1、阻塞队列概述
阻塞队列#xff0c;一个生产消费模式#xff0c;当先进先出类似排队栈先进后出用于要优先处理最近发生的事件的场景
1、阻塞队列概述
阻塞队列一个生产消费模式当
队列放满了put不进去了put的线程阻塞挂起等可以put了再唤起取没了只能等待取的线程阻塞挂起等可以取了再唤起 而亮点就在于什么时候阻塞线程什么时候唤起线程则由BlockingQueue一手包办。 2、阻塞队列分类 ArrayBlockingQueue底层是一个定长数组有界阻塞队列 LinkedBlockingQueue底层是一个链表有界阻塞队列但它的默认值其实足够大了大小默认值为Integer.MAX_VALUE DelayQueue队列中的元素只有到了指定的延迟时间才能获取到该元素。是无界队列因此生产者线程永不阻塞 PriorityBlockingQueue支持优先级排序的无界阻塞队列优先级的判断通过其构造方法传入Compator对象决定 SynchronousQueue无中介一种不存储元素的阻塞队列、单个元素的队列一个线程写入了数据就必须得有一个线程取否则不能再继续添加用于传递性的场景 LinkedTransferQueue底层是一个链表无界阻塞队列。亮点是其有预占模式其消费者线程取元素时若队列为空就生成一个元素为null的节点入队消费者线程就等待在这个节点上后续生产者线程来了发现有个元素为null的节点就不再入队直接把数据填充给这个null节点并唤醒改null节点上等待的消费者线程取走元素 LinkedBlockingDeque底层是一个链表双向阻塞队列可以从队列的两端插入和移除元素
3、 阻塞队列的四组核心方法
插入相关的有add、offer、put移除相关的有remove、poll、take检查相关的有element、peek
按照队列空或者队列满时的表现可分为以下四组 以列为单位来看以上表格的含义
抛出异常列插入、移除、检查对应三个方法add、remove、element这一组是队列满或空时再调就抛出异常特殊值列插入、移除、检查对应三个方法offer、poll、peek这一组是队列满时调offer插入返回false而不是抛异常阻塞列插入、移除对应两个方法put、take这一组是队列满时再调put就一直阻塞直到put成功take同理超时列插入、移除对应两个方法offer、poll这一组是队列满时再调offer来放数据会阻塞但有个最大时间超过这个时间生产者线程就自动退出
//创建阻塞队列
BlockingQueueInteger blockingQueue new ArrayBlockingQueue(3);
//写
for (int i 0; i 4; i) {blockingQueue.add(i);
}抛异常 4、Demo
创建一个阻塞队列开两个线程分别对这个队列进行写个读采用上面阻塞列的那一组方法演示下生产消费者模式
public class BlockQueueDemo {public static void main(String[] args) throws InterruptedException {//创建阻塞队列BlockingQueueInteger blockingQueue new ArrayBlockingQueue(3);//生产者线程new Thread(() - {for (int i 0; i 10; i) {try {blockingQueue.put(i);System.out.println(Thread.currentThread().getName() 线程写数据成功 i);} catch (InterruptedException e) {e.printStackTrace();}}}).start();//消费者线程new Thread(() - {for (int i 0; i 10; i) {try {//每次取之前歇3秒模拟生产快消费慢的场景TimeUnit.SECONDS.sleep(3);Integer takeValue blockingQueue.take();System.out.println(Thread.currentThread().getName() 线程取数据成功 takeValue);} catch (InterruptedException e) {e.printStackTrace();}}}).start();}
}
可以看到刚开始写线程可以写3个数据到阻塞队列然后挂起等消费线程取走一个则可再写一个此时消费慢阻塞队列满了生产线程再次自动挂起进入阻塞。 关于阻塞队列的具体应用 线程池下篇整理。 API文档https://tool.oschina.net/apidocs/apidoc?apijdk-zh