阻塞队列

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、阻塞队列的好处

①降低多线程开发难度。阻塞队列本身是线程安全的,生产者、消费者操作队列时不需要考虑线程安全问题。

②逻辑解耦。将任务放入阻塞队列中,实现生产者和消费者互相隔离,互不影响。

 

以上是关于阻塞队列的主要内容,如果未能解决你的问题,请参考以下文章

阻塞队列--概述

并发阻塞队列和非阻塞队列详解

什么是阻塞队列?如何使用阻塞队列来实现生产者-消费者模型?

阻塞队列和线程池原理

阻塞队列BlockingQueue

阻塞队列与非阻塞队列