您的位置:首页 > 产品设计 > UI/UE

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

2016-12-07 22:42 447 查看
投入多少,收获多少;参与多深,领悟多深

参考文献: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: