Java中的阻塞队列BlockingQueue

阅读数:115 评论数:0

跳转到新版页面

分类

python/Java

正文

一、概述

在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景。

阻塞队列提供了四种处理方法:

方法\处理方式 抛出异常 返回特殊值 一直阻塞 超时退出
插入方法 add(e) offer(e) put(e) offer(e,time,unit)
移除方法 remove() poll() take() poll(time,unit)
检查方法 element() peek() 不可用 不可用

二、ArrayBlockingQueue

是用数组实现的有界阻塞队列,此队列按照FIFO的原则进行排序。支持公平锁和非公平锁(每一个线程在获取锁的时候可能会排队等待,如果在等待时间上,先获取锁的线程的请求一定先被满足,那么这个锁就是公平的。反之,这个锁就是不公平的)。

三、LinkedBlockingQueue

一个由链表结构组成的有界队列,此队列的长度为Integer.MAX_VALUE,FIFO。

如果你想要一次性地从 LinkedBlockingQueue 中取出所有元素,可以使用drainTo()方法 

LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>();
// 假设队列已经被填充了数据

List<String> list = new ArrayList<>();
queue.drainTo(list); // 将队列中的所有元素移动到list中

// 此时,list包含了之前在queue中的所有元素,queue变为空

四、PriorityBlockingQueue

一个支持线程优先级排序的无界队列,可以自定义实现compareTo()方法来指定元素排序规则,不能保证同优先级元素的顺序。

五、DelayQueue

基于PriorityBlockingQueue的延迟获取队列,在创建元素时,可以指定多久才能从队列中获取当前元素,只有延时期满后才能从队列中获取元素。

六、SynchronousQueue

一个不存储元素的阻塞队列,每一个put操作必须等待take操作,否则不能添加元素。

七、LinkedTransferQueue

采用一种预占模式,意思就是消费者线程取元素时,如果队列不为空,则直接取走数据,若队列为空,那就生成一个节点(节点元素为null)入队,然后消费者线程被等待在这个节点上,后面生产者线程入队时发现有一个元素为null的节点,生产者线程就不入队了,直接就将元素填充到该节点,并唤醒该节点等待的线程,被唤醒的消费者线程取走元素,从调用的方法返回。我们称这种节点操作为“匹配”方式。

八、LinkedBlockingDeque

一个由链表结构组成的双向阻塞队列。

 

 




相关推荐

1、基本类型 在程序设计中经常用到一系列类型(基本类型),它们需要特殊对待。对于这些类型,Java采取与C和C++相同的方法,也就是说,不用new来创建变量,于是创建一个并非引

1、直接常量 为了编译器可以准确的知道要生成什么样的类型,可以给直接常量后面添加后缀字符标志它的类型,若为L表示long,F表示float,D表示double。也可以利用前缀表示进制,0x表示十六进制

Java完全采用动态内存分配方式。每当想创建新对象时,就需要使用new关键字来构建此对象实例。 1、this 在构造器中,如果为this添加了参数列表,那么就有了

一、类的继承 1、说明 (1)extends关键字用于类的继承。 (2)在C++中,方法的动态绑定是使用virtual关键字来实现的,而在Java中,动态绑定是默认的形为,不需要添加额外的关键字。 (

1、类型信息 指程序能够在运行时发现和使用类型信息,我们一般使用两种方式来实现运行时对象和类的信息:传统的RTTI和反射机制。 (1)class对象 <p

用于描述Java源代码,使得我们能够以将由编译器来测试和验证的格式,存储有关程序的额外信息。使用时在@后面跟注解的名字。 1、预定义的三个注解<

一、创建线程 创建线程有四种方式:继承Thread类、实现Runnable接口、实现Callable接口、通过线程池创建。 1、继承Thread 重写run方法。 class A extends Th

一、Collection接口 Collection接口的iterator和toArray方法都用于获得集合中的“所有元素”。前者返回一个“iterator”对象,后者返回一个包含集合中所有元素的数组。

1.hashCode的存在主要用于查找的快捷性,如hashtable,hastmap等,hashcode是用来在散列存储结构中确定对象的存储地址的。 2.如果两个对象相同,就是适用

Java中的数据类型,可分为两类: 1.基本数据类型,它们之间的比较,应用双等号,比较的是它们的值。 2.复合数据类型(类) 当他们用双等号进行比较的时