多线程之间的交互:线程阀(一)之阻塞队列BlockingQueue简介

投入多少,收获多少;参与多深,领悟多深
参考文献:Java并发变成从入门到精通

线程阀是一种线程与线程之间相互制约和相互交互机制

阻塞队列BlockingQueue

Queue(队列):用于保存一组原色,不过在存储元素的时候必须遵循先进先出原则。队列是一种特殊的线性表,它只允许在表的前段进行删除操作,而在表的后端进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为对头。对列中没有元素时称为空队列。在队列这种数据结构中,最先插入的元素将是最先被删除的元素,反之最后插入的元素将是最后被删除的元素,因此队列又称为先进先出的线性表。

Deque(双端对列):两端都可以进行进出的队列。当我们约束从对列的一段进出对时,就形成了另一种存储模式,它遵循先进后出原则,这就是栈结构。双端队列主要用于栈操作。

BlockingQueue(阻塞对列):是支持两个附加操作的队列。这两个附加操作是:在队列为空时,获取元素线程会等待队列为非空;当队列满时,存储元素线程会等待队列可用。
阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列中获取元素的线程、阻塞队列是生产者存放元素和消费者获取元素的容器

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

这里写图片描述

抛出异常:当阻塞队列满时,再往队列里插入元素,会抛出IllegalStateException(“Queue full”)异常。当队列为空是,从队列里拿取元素时(移除方法)会抛出NoSuchElementException异常

返回特殊值:插入方法会返回是否成功,若成功则返回true,移除方法,则是从队列里拿出一个元素,若是没有则返回null。

一直阻塞:当阻塞队列满时,如果生产者线程往队列里put元素时,队列会一直阻塞生产者线程,直至队列拿到数据,或者响应中断推出。当队列为空时,消费者线程试图从队列中take元素,队列也会阻止消费者线程,直至队列可用。

超时退出:当阻塞队列满时,队列会阻塞生产者线程一段时间,如果超出一定时间,生产者线程就会退出;当阻塞队列为空时,队列会阻塞消费者线程一段时间,如果超出一定时间,消费者线程就会退出。

BlockingQueue常用的几种方法

add(anObject):把anObject加到BlockingQueue里,如果BlockingQueue可以容纳则返回true,否则抛出异常;

offer(anObject):表示如果可能的话,将anObject加到BlockingQueue里,如果BlockingQueue可以容纳则返回true,否则返回false;

put(anObject):把anObject加到BlockingQueue里,如果BlockingQueue没有空间,则调用此方法的线程被阻塞,直到BlockingQueue里面有空间在继续;

poll(time):取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等时间参数规定的时间,去不到时返回null

take():取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻塞进入等待状态直至BlockingQueue有新的对象被加入为止;

BlockingQueue不接受null元素,试图add、put、offer一个null元素时,某些实现会抛出NullPointerExceprion异常。

JDK中提供的阻塞队列,后续会逐一学习

BlockingDeque
DelayQueue
ArrayBlockingQueue
LinkedBlockingQueue
LinkedBlockingDeque
PriorityBlockingQueue
SynchronousQueue

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值