1.什么是阻塞队列
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。
2.阻塞队列的类型
- ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。
- LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。
- PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。
- DelayQueue:一个使用优先级队列实现的无界阻塞队列。
- SynchronousQueue:一个不存储元素的阻塞队列。
- LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
- LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。
阻塞队列有七种,但是常用的只有三种,使用LinkedBlockingQueue需要注意的是创建的时候要设置大小,否则默认是Integer.MAX_VALUE
3.阻塞队列的优点
1)可以灵活地控制多线程并发:使用阻塞队列可以灵活地控制线程之间的同步交互,而不需要许多复杂的同步机制。
2)吞吐量优化:阻塞队列可以有效地提高任务的执行速度和效率,从而提高整体的吞吐量。
3)消息传递:它还可以帮助线程之间传递消息,简化任务执行流程。
4)4.简化编程∶它可以帮助编译器正确的编译程序,从而简化程序的编写过程。
5)5.可靠性高︰它可以有效减少应用程序出现内存溢出等错误的可能性,这样可以提高呈序的可靠性和安全性。
4.阻塞队列的核心方法
方法类型 | 抛出异常 | 特殊值 | 阻塞 | 超时 |
---|---|---|---|---|
插入 | add(e) | offer(e) | put(e) | offer(e,time,unit) |
移除 | remove | poll() | take() | poll(time,unit) |
检查 | element() | peek() | 无 | 无 |
- 抛异常:如果试图的操作无法立即执行,抛一个异常。
- 特定值:如果试图的操作无法立即执行,返回一个特定的值(常常是 true / false)。
- 阻塞:如果试图的操作无法立即执行,该方法调用将会发生阻塞,直到能够执行。
- 超时:如果试图的操作无法立即执行,该方法调用将会发生阻塞,直到能够执行,但等待时间不会超过给定值。返回一个特定值以告知该操作是否成功(典型的是true / false)。
5.阻塞队列的原理
其实阻塞队列实现阻塞同步的方式很简单,使用的就是是lock锁的多条件(condition)阻塞控制。使用BlockingQueue封装了根据条件阻塞线程的过程,而我们就不用关心繁琐的await/signal操作了。