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、直接常量
为了编译器可以准确的知道要生成什么样的类型,可以给直接常量后面添加后缀字符标志它的类型,若为L表示long,F表示float,D表示double。也可以利用前缀表示进制,0x表示十六进制
一、类的继承
1、说明
(1)extends关键字用于类的继承。
(2)在C++中,方法的动态绑定是使用virtual关键字来实现的,而在Java中,动态绑定是默认的形为,不需要添加额外的关键字。
(
一、创建线程
创建线程有四种方式:继承Thread类、实现Runnable接口、实现Callable接口、通过线程池创建。
1、继承Thread
重写run方法。
class A extends Th
一、Collection接口
Collection接口的iterator和toArray方法都用于获得集合中的“所有元素”。前者返回一个“iterator”对象,后者返回一个包含集合中所有元素的数组。
1.hashCode的存在主要用于查找的快捷性,如hashtable,hastmap等,hashcode是用来在散列存储结构中确定对象的存储地址的。
2.如果两个对象相同,就是适用