【工具类】BlockingQueue 的介绍和使用
作用
BlockingQueue为一个阻塞队列,这里的阻塞有两个含义
- 从队列中获取元素时,如果队列为空,获取元素的线程会等待至队列中有元素再返回。
- 往队列添加元素时,如果队列已满,添加元素的队列会等待至队列有位置的时候再添加新的元素
特点
- BlockingQueue中的元素不能为空
- 为线程安全的,但是涉及到批量操作时就不一定是原子操作。比如addAll,removeAll这种。
- 可以用来实现生产者-消费者队列的,并且支持多消费者和多生产者。当然也可以用来当作普通的Collection来使用,因为他实现了java.util.Collection接口。
- 有界队列,并不是真正的无界队列,他的最大值为Integer.MAX_VALUE.
使用
在BlockingQueue中有多种插入删除和获取元素的方法。每种方法都会有不同的作用,下面会介绍BlockingQueue的几个核心方法
插入元素
- boolean add(E e):如果队列中有空间,立即插入一个元素到队列中,并返回true。如果队列中没有空间了,就会抛出IllegaStateException异常。对于游街队列,更常用的是使用offer方法。
- boolean offer(E e):如果队列中有空间,立即插入一个元素到队列中,并返回true,如果没有空间则返回false。
- void put(E e):插入一个元素到队列中,如果该队列当前已满,则该方法会一只阻塞,直到有位置可以添加后才会继续执行。
- boolean offer(E e,long timeout,TimeUnit unit):插入一个元素到队列中,如果队列已满则等待timeout时长,插入成功并返回true,超时则返回false.
获取元素
- E take():获取列头部的第一个元素,并在队列中移除,如果队列中没有元素,则会一直等待直到有元素来返回。
- E poll(long timeout,TimeUnit unit): 取得队列头部的第一个元素,并讲它从队列中移除,如果队列中没有元素会等待timeout时常。
移除元素
- boolean remove(Object o):从队列中移除指定的元素(当队列中存在这个元素时),判断方式equals方法。如果移除的元素和队列中元素的类型不一样,就会抛出ClassCastException异常,如果队列中有多个元素,就会移除掉最先超乳到队列中的那一个。
检索一个元素
- E remove():检索出队列中头部第一个元素,但是不会删除,如果队列为空则抛出NoSuchElemenException异常
- E peel(): 也是用来检索队列中的第一个元素,也不会删除,如果队列为空的时候,不会抛出异常而是返回null。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix