BlockingQueue,是一个接口,支持泛型。BlockingQueue接口继承了Queue接口,Queue是队列的意思。Queue接口又继承了Collection接口。阻塞队列是一个额外支持两个操作的队列:在队列为空时,从队列中取元素的线程会阻塞。以及在队列满时,往队列里添加元素的线程会阻塞。这两个方法分别是put(E e)和take()。

BlockingQueue接口方法:

方法 抛异常 返回特定值 阻塞 超时后返回
添加元素 add(E e) offer(E e) put(E e) offer(E e, log timeout, TimeUnit unit)
取出队首元素 remove() poll() take() poll(long timeout, TimeUnit unit)
查询队首元素 element() peek() - -

抛异常,指的是在队列满时添加元素会抛IllegalStateException异常,或者在队列空时取元素会抛NoSuchElementException异常。其实感觉抛异常的方法不太友好,像offer(E e)一样,队列满时添加元素返回false,像poll()一样,队列空时取元素返回null,这多好。

在jdk中,BlockingQueue有7个实现类:

1、ArrayBlockingQueue:一个由数组实现的有界阻塞队列。ArrayBlockingQueue有3个构造器,ArrayBlockingQueue(int capacity)、ArrayBlockingQueue(int capacity, boolean fair)、ArrayBlockingQueue(int capacity, boolean fair, Collection c)。ArrayBlockingQueue有个Object[] items成员变量,数组的长度等于capacity。还有个ReentrantLock lock成员变量,是否公平由fair决定,默认非公平锁。第三个构造器额外有个Collection实例参数,表示可以构造一个有一些初始数据的实例,当Collection实例的长度大于capacity时,会抛出IllegalArgumentException异常。ArrayBlockingQueue是线程安全的,所有操作元素的方法都同一个ReentrantLock实例加持。

2、LinkedBlockingQueue:一个由链表实现的有界或者无界阻塞队列。在Executors.newFixedThreadPool()和Executors.newSingleThreadExecutor()中用到。LinkedBlockingQueue有3个构造器:LinkedBlockQueue()、LinkedBlockQueue(int capacity)、LinkedBlockQueue(Collection c)。LinkedBlockQueue(int capacity)是有界队列,最多只能放这么多个元素。LinkedBlockQueue()和LinkedBlockQueue(Collection c)内部实现都是LinkedBlockQueue(Integer.MAX_VALUE),队列中可以一直放元素,直到Integer.MAX_VALUE,这就是无界队列了。LinkedBlockQueue内部有2个可重入锁,takeLock和putLock,且都是非公平锁,没得选。LinkedBlockingQueue也是线程安全的,所有的添加元素方法都一个非公平的ReentrantLock实例putLock加持,所有的取出元素方法、查看元素方法都一个非公平的ReentrantLock实例takeLock加持。线程池中假如用无界阻塞队列,则核心线程之外的线程不会启动,且系统有OOM的风险。

3、PriorityBlockingQueue:一个支持优先级的无界阻塞队列。PriorityBlockingQueue始终保证出队的元素是优先级最高的元素,内部使用二叉树最小堆算法维护一个Object数组,这个数组是可扩容的,在添加元素时,如果队列中元素的数量大于等于内部数组的长度,就会扩容,所以是无界队列。在构造队列时,可以传一个Comparable对象,如果不传的话,就会用元素的compareTo方法排序。如果元素不是Comparable实例,就会报ClassCastException异常。PriorityBlockingQueue有4个构造器:PriorityBlockingQueue()、PriorityBlockingQueue(int initialCapacity)、PriorityBlockingQueue(int initialCapacity, Comparable comparator)、PriorityBlockingQueue(Collection c)。PriorityBlockingQueue()内部实现是PriorityBlockingQueue(11,null),即初始容量是11,不传入比较器。因为是无界队列,所以不会有队列满的情况,所以put(E e)等同于offer(E e)方法,add(E e)也等同于offer(E e)方法。但是,remove()还是抛异常的,poll()还是返回值的,take()还是阻塞的。PriorityBlockingQueue也是线程安全的,所有操作元素的方法都同一个非公平的ReentrantLock实例加持。

4、DelayQueue:一个支持优先级、支持延时获取元素的无界阻塞队列。队列中的元素必须实现java.util.concurrent.Delayed接口。在创建元素时,可以指定多久才能从队列中获取元素。当不到指定时间(元素的getDelay(TimeUnit unit)方法返回值大于0)或者队列为空时,remove()会抛异常,poll()会返回null,take()会阻塞,直到时间到。DelayQueue有2个构造器:DelayQueue()、DelayQueue(Collection<Delayed> c)。DelayQueue有一个PriorityQueue类型的成员变量,值是new PriorityQueue(),指定PriorityQueue初始容量是默认值11,无比较器。比较器是Delayed实例,因为Delayed接口继承了Comparable<Delayed>接口,DelayQueue中元素顺序会由元素的compareTo(Delayed d)方法决定。PriorityQueue同PriorityBlockingQueue一样,内部也是使用二叉树最小堆算法维护一个Object数组,数组可扩容。直接遍历DelayQueue队列是无序的,通过remove()/poll()/take()方法取队首元素是有序的。DelayQueue也是线程安全的,所有操作元素的方法都由同一个非公平的ReentrantLock实例加持。

DelayQueue可以用于以下场景:

缓存系统:在把数据放入缓存时,把数据的缓存到期时间戳和id放到队列中,用一个线程持续take,如果取到元素不为null,则表示对应数据到了deadline,就从缓存中删除对应数据。

定时系统:把下次执行时间戳放到队列中,用一个线程持续take,如果取到元素不为null,则表示对应任务到时间了,执行即可。

ScheduledThreadPoolExecutor类中有一个ScheduledFutureTask内部类,实现了Delayed接口。

5、SynchronousQueue:一个不存储任何元素的伪队列。在Executors.newCachedThreadPool()中用到。SynchronousQueue有2个构造器:SynchronousQueue()、SynchronousQueue(boolean fair)。SynchronousQueue()内部实现是SynchronousQueue(false)。fair同样表示阻塞的线程是否公平地访问队列。因为不存储元素,所以add(E e)、remove()恒抛异常,offer(E e)恒返回false,poll()恒返回null,put(E e)、take()恒阻塞。

Executors.newScheduledThreadPool()和Executors.newSingleThreadScheduledExecutor()用到的是DelayedWorkQueue,是ScheduledThreadPoolExecutor的内部类,继承了BlockingQueue接口。

Activemq API使用(整合spring)的更多相关文章

  1. 消息中间件-activemq实战之整合Spring(四)

    前面的理论准备已经很充分,这一节我们来实战:将activemq整合到Spring框架才行中,因为Spring已经集成了JMS,这也为我们配置activermq带来了方便. 1. Spring对jms的 ...

  2. Activemq API使用(不整合spring)

    首先需要引入activemq的jar包,这里用的是5.14.4版本的 <!-- https://mvnrepository.com/artifact/org.apache.activemq/ac ...

  3. ActiveMQ整合spring、同步索引库

    1.   Activemq整合spring 1.1. 使用方法 第一步:引用相关的jar包. <dependency> <groupId>org.springframework ...

  4. ActiveMQ之整合spring

    ActiveMQ可以轻松的与Spring进行整合,Spring提供了一系列的接口类,非常的好用! 比如异步消息数据.异步发送邮件.异步消息查询等 <dependency> <grou ...

  5. JAVAEE——宜立方商城09:Activemq整合spring的应用场景、添加商品同步索引库、商品详情页面动态展示与使用缓存

    1. 学习计划 1.Activemq整合spring的应用场景 2.添加商品同步索引库 3.商品详情页面动态展示 4.展示详情页面使用缓存 2. Activemq整合spring 2.1. 使用方法 ...

  6. 淘淘商城项目_同步索引库问题分析 + ActiveMQ介绍/安装/使用 + ActiveMQ整合spring + 使用ActiveMQ实现添加商品后同步索引库_匠心笔记

    文章目录 1.同步索引库问题分析 2.ActiveM的介绍 2.1.什么是ActiveMQ 2.2.ActiveMQ的消息形式 3.ActiveMQ的安装 3.1.安装环境 3.2.安装步骤 4.Ac ...

  7. ActiveMQ 入门和与 Spring 整合

    ActiveMQ 入门演示 activemq 依赖 <dependency> <groupId>org.apache.activemq</groupId> < ...

  8. e3mall商城的归纳总结9之activemq整合spring、redis的缓存

    敬给读者 本节主要给大家说一下activemq整合spring,该如何进行配置,上一节我们说了activemq的搭建和测试(单独测试),想看的可以点击时空隧道前去查看.讲完了之后我们还说一说在项目中使 ...

  9. webservice 服务端例子+客户端例子+CXF整合spring服务端测试+生成wsdl文件 +cxf客户端代码自动生成

    首先到CXF官网及spring官网下载相关jar架包,这个不多说.webservice是干嘛用的也不多说. 入门例子 模拟新增一个用户,并返回新增结果,成功还是失败. 大概的目录如上,很简单. Res ...

随机推荐

  1. Requests接口测试(五)

    使用python+requests编写接口测试用例 好了,有了前几章的的基础,写下来我把前面的基础整合一下,来一个实际的接口测试练习吧. 接口测试流程 1.拿到接口的URL地址 2.查看接口是用什么方 ...

  2. ORCHARD学习教程-安装

    安装说明:测试对象为正式版1.8 安装方法: 使用Microsoft Web Platform Installer 利用Microsoft WebMatrix 来安装 Working with Orc ...

  3. 百度图片API

    转载请注明出处:http://blog.csdn.net/yuanwofei/article/details/16343743 一.通用api http://image.baidu.com/i?tn= ...

  4. 快速下载android源码

    众所周知的原因,android源码被墙了,还好国内有不少镜像,这里使用清华提供的镜像. 以下内容转自: https://wiki.tuna.tsinghua.edu.cn/MirrorUsage/an ...

  5. css css预处理器

    CSS预处理器(css preprocessor) 1.less: 2.sass: 3.scss: 4.stylus 参考: http://hao.jser.com/archive/2507/ htt ...

  6. loj #6226. 「网络流 24 题」骑士共存问题

    #6226. 「网络流 24 题」骑士共存问题   题目描述 在一个 n×n\text{n} \times \text{n}n×n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上 ...

  7. Java面向对象之关键字static 入门实例

    一.基础概念 静态关键字 static 是成员修饰符,直接用于修饰成员. (一)特点: 1.被静态修饰的成果,可以直接被类名所调用. 2.静态成员优先于对象存在. 3.静态成员随着类的加载而加载.随着 ...

  8. [Swift]八大排序算法(一):冒泡排序

    排序分为内部排序和外部排序. 内部排序:是指待排序列完全存放在内存中所进行的排序过程,适合不太大的元素序列. 外部排序:指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存 ...

  9. Leetcode 25. Reverse Nodes in k-Group 以每组k个结点进行链表反转(链表)

    Leetcode 25. Reverse Nodes in k-Group 以每组k个结点进行链表反转(链表) 题目描述 已知一个链表,每次对k个节点进行反转,最后返回反转后的链表 测试样例 Inpu ...

  10. SDUT OJ 数据结构实验之排序一:一趟快排

    数据结构实验之排序一:一趟快排 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...