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. jQuery 演变史

    一.说明 最近我读完了 jQuery 官方的博客仓库,目的是为了梳理清楚 jQuery API 接口的演变过程.从而明确知道在对应版本下使用正确.合适的 API,以下便是我的总结笔记. jQuery ...

  2. javascript总结8:JavaScript 类型转换

    1 JavaScript 数据类型转换 1.1 数字类型转字符串 n1 = 10;var n2 =String(n1); 或者 var n3 = n1.toString(n1); 1.2 字符串转数字 ...

  3. MySQL性能调优与架构设计——第3章 MySQL存储引擎简介

    第3章 MySQL存储引擎简介 3.1 MySQL 存储引擎概述 MyISAM存储引擎是MySQL默认的存储引擎,也是目前MySQL使用最为广泛的存储引擎之一.他的前身就是我们在MySQL发展历程中所 ...

  4. 关于JAVA数组的几点注意事项与一些低级错误

    1.数组不是集合,它只能保存同种类型的多个原始类型或者对象的引用.数组保存的仅仅是对象的引用,而不是对象本身. 2.数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型 ...

  5. delphi Post数据到网页

    var http: TIdHttp; sendtoserver: TStringStream; str: string; begin http := TIdHttp.Create(); // 创建 h ...

  6. Java集合类总结 (一)

    集合类中的基本接口 集合类中最基础的接口是Collection: public interface Collection<E> { boolean add(E element); Iter ...

  7. DES加密与解密MD5加密帮助类

    public class TrialHelper { //默认密钥向量 private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xA ...

  8. java 文件硬盘存取 练习

    读写文件操作 对字符流文件读写 1 写文件 FileOutputStream 节点类 负责写字节 OutputStreamWriter 转化类  负责字节到字符转换 BufferedWriter 装饰 ...

  9. day08.4-samba共享网盘服务

    1. 安装软件:yum   install   samba   -y 2. 新建共享目录物理路径:mkdir   /zizaijiapu 修改配置文件:vim   /etc/samba/smb.con ...

  10. Python实例手册

    在电脑中突然发现一个这么好的资料,雪松大神制作,不敢独享,特与大家共享.连他的广告也一并复制了吧! python实例手册 #encoding:utf8 # 设定编码-支持中文 0说明 手册制作: 雪松 ...