阻塞队列
Posted DustAsh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阻塞队列相关的知识,希望对你有一定的参考价值。
java.util包下Queue接口,BlockingQueue在Queue的基础上添加了put和take两个阻塞方法。
特点:阻塞,put和take两个阻塞方法。
1、使用场景:
生产者、消费者模式,生产者通过put方法往队列里添加元素,若队列满了,put方法将阻塞等待,一旦队列容量有剩余,将唤醒等待线程;消费者使用take方法从队列里取元素,若队列为空,将阻塞等待,一旦队列有数据,将唤醒等待线程。
2、几个重要的类型
①ArrayBlockingQueue:基于数组的有界阻塞队列,默认最大容量Integer.MAX_VALUE,约为 2 的 31 次方;可指定是否公平,默认非公平。
②LinkedBlockingQueue:基于链表的有界阻塞队列,默认最大容量Integer.MAX_VALUE,约为 2 的 31 次方;可指定是否公平,默认非公平;生产者和消费者使用两个不同的锁,提高并发性能。
③DelayQueue:延时无界阻塞队列,可以指定延迟时间,只有当延迟时间到了才可从队列中获取元素。应用场景:缓存有效时间设计,使用DelayQueue保存缓存数据,同时设置延迟时间,使用一个线程轮询获取队列元素,当获取到数据时表示延迟时间达到了,也就是缓存时间有效期到了;定时任务调度,使用该类型队列保存任务和延迟执行时间,只要获取到队列中的元素就开始执行。
④PriorityBlockingQueue:优先级阻塞队列。可以给入队元素制定优先级,元素按照优先级顺序出队列。
⑤SynchronousQueue:不存储元素的阻塞队列,put放入元素后必须等待take,否则不能继续添加元素。可看作一个传球手,把生产者线程生产的数据直接传递给消费者线程。其吞吐量高于ArrayBlockingQueue和LinkedBlockingQueue。CachedThreadPool线程池使用的就是该类型队列。
3、阻塞队列的好处
①降低多线程开发难度。阻塞队列本身是线程安全的,生产者、消费者操作队列时不需要考虑线程安全问题。
②逻辑解耦。将任务放入阻塞队列中,实现生产者和消费者互相隔离,互不影响。
以上是关于阻塞队列的主要内容,如果未能解决你的问题,请参考以下文章