您现在的位置是:亿华云 > 系统运维
面试官:阻塞队列有了解过吗?
亿华云2025-10-08 23:18:53【系统运维】9人已围观
简介前言本节就一起探讨一下什么是阻塞队列,一起来看下吧!什么是阻塞队列我们先说一下为什么要引入阻塞队列。我们知道服务器的资源是有限的,就拿典型的生产者和消费者模型来讲。消费者如果没有东西可以消费了,但是它
前言
本节就一起探讨一下什么是面试阻塞队列,一起来看下吧!官阻
什么是塞队阻塞队列
我们先说一下为什么要引入阻塞队列。我们知道服务器的解过资源是有限的,就拿典型的面试生产者和消费者模型来讲。
消费者如果没有东西可以消费了,官阻但是塞队它还是在一直执行,这无疑是解过在浪费系统资源,所以我们需要阻塞消费者,面试换过来同理。官阻
生产者没有东西可生产了或者说没有地方存储它生产的塞队东西,这时候我们就需要阻塞生产者。解过
然而,面试在开发中,官阻这种模型往往运行在多线程环境中,塞队需要对资源共享从而达到更高的性能,但这样也会造成线程安全问题,比如死锁、重复消费 所以阻塞队列就是帮我们解决这些问题的。
BlockingQueue
下面我们就一起看一下Java中给我们提供了哪些好用的工具,服务器租用先给大家介绍一下BlockingQueue, 本节我们主要讲它的用法。
BlockingQueue是Java util.concurrent包下的类,BlockingQueue提供了「线程安全的队列访问方式」,并发包下很多高级同步类的实现都是基于BlockingQueue实现的。
BlockingQueue一般用于生产者-消费者模式,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。「BlockingQueue就是存放元素的容器」。
public interface BlockingQueue<E> extends Queue<E> { ....}它本身是一个接口,我们看下它常用的实现类。
ArrayBlockingQueue
一个用数组实现的有界阻塞队列,此队列按照先进先出(FIFO)的原则对元素进行排序, 支持公平锁和非公平锁。
add() 添加元素。// 初始化 容量为3
BlockingQueue
System.out.println(queue.add("1"));
System.out.println(queue.add("2"));
System.out.println(queue.add("3"));
System.out.println(queue.add("4"));我们发现添加到4的时候,报错了Exception in thread "main" java.lang.IllegalStateException: Queue full。企商汇
remove() 移除元素,如果为空,会返回异常。// 初始化 容量为3
BlockingQueue
System.out.println(queue.add("1"));
System.out.println(queue.add("2"));
System.out.println(queue.add("3"));
// System.out.println(queue.add("4"));
System.out.println(queue.remove());
System.out.println(queue);打印:
true
true
true
1
[2, 3]从结果来看,符合FIFO规则,如果我想移除指定元素怎么办呢?很简单,使用remove("3")。
offer() 和add方法类似,但是它不会报错,它会返回false, offer(e,time,unit)支持超时。BlockingQueue
System.out.println(queue.offer("1"));
System.out.println(queue.offer("2"));
System.out.println(queue.offer("3"));
System.out.println(queue.offer("4"));true
true
true
falsepoll() 与remove相似,但它不会返回异常而是返回null, poll(time,unit)。BlockingQueue
System.out.println(queue.poll());nulltake() 与 poll类似, 但它会造成线程阻塞。public static void main(String[] args) throws InterruptedException {
BlockingQueue
System.out.println(queue.take());
}运行后,我们发现程序被阻塞了。
put() 添加元素,当容器满的时候,会造成线程阻塞。public static void main(String[] args) throws InterruptedException {
BlockingQueue
queue.put("1");
queue.put("2");
}运行后发现,执行到2的时候被阻塞了。
以上是它的常用方法,其它的实现类就不一一给大家演示了,方法差不多,都是基于BlockingQueue接口,可以自己试着运行一下看看。
LinkedBlockingQueue
一个由链表结构组成的有界队列,此队列的长度为Integer.MAX_VALUE。源码库
SynchronousQueue
是一个不存储元素的阻塞队列,每一个put操作必须等待take操作,否则不能添加元素。支持公平锁和非公平锁。SynchronousQueue的一个使用场景是在线程池里。Executors.newCachedThreadPool()就使用了SynchronousQueue,这个上节我们讲线程复用的时候遇到过。
LinkedTransferQueue
是一个由链表结构组成的无界阻塞队列,相当于其它队列,LinkedTransferQueue队列多了transfer和tryTransfer方法。
PriorityBlockingQueue
是一个支持线程优先级排序的无界队列,默认自然序进行排序,也可以自定义实现compareTo()方法来指定元素排序规则,不能保证同优先级元素的顺序。
DelayQueue
一个实现PriorityBlockingQueue实现延迟获取的无界队列,在创建元素时,可以指定多久才能从队列中获取当前元素。只有延时期满后才能从队列中获取元素,在缓存设计和定时任务调度中经常会遇到。
结束语
本节主要给大家介绍了常用的阻塞队列以及它的基本使用。
很赞哦!(42166)
相关文章
- 因为域名解析需要同步到DNS根服务器,而DNS根服务器会不定时刷,只有DNS根服务器刷新后域名才能正常访问,新增解析一般会在10分钟左右生效,最长不会超过24小时,修改解析时间会稍微延长。
- 比较短的域名方便用户记忆和传播,它带来的好处往往会超过其他类型的域名,如果你非要域名短而且还要包含关键词,那么往往会事与愿违,现在这种域名基本上是可遇而不可求的。
- 国内域名
- 新手可以注册cc域名吗?cc域名有什么特点?
- (4) 使用何种形式的域名后缀对网页搜索影响不大,但域名后缀也需要考虑方便用户记忆
- 只要我们做的是从目前的市场情况选择域名,从简单易记,从个性特征上,我们就可以找到一个好域名进行注册。域名注册进行域名记录和解析以及绑定网站后,客户可以通过URL登录您的网站。
- 为什么喜欢国外注册域名?国外注册域名注意什么?
- cm域名有什么独特之处?新人要了解cm域名哪些?
- 3、不明先知,根据相关征兆预测可能发生的事件,以便提前做好准备,赶紧注册相关域名。;不差钱域名;buchaqian抢先注册,就是这种敏感类型。预言是最敏感的状态。其次,你应该有眼力。所谓眼力,就是善于从社会上时不时出现的各种热点事件中获取与事件相关的域名资源。眼力的前提是对域名领域的熟悉和丰富的知识。
- 第三,.cc域名域名也有很多优势资源域名,从整体注册基数也可以由此推断;
热门文章
站长推荐
.net 适用于从事Internet相关的网络服务的机构或公司
旧域名的外链是否会对新建站点产生影响?
公司名字不但要与其经营理念、活动识别相统一,还要能反映公司理念,服务宗旨、商品形象,从而才能使人看到或听到公司的名称就能产生愉快的联想,对商店产生好感。这样有助于公司树立良好的形象。
3、查看排名
第三,.cc域名域名也有很多优势资源域名,从整体注册基数也可以由此推断;
4.选择顶级的域名注册服务商
3、不明先知,根据相关征兆预测可能发生的事件,以便提前做好准备,赶紧注册相关域名。;不差钱域名;buchaqian抢先注册,就是这种敏感类型。预言是最敏感的状态。其次,你应该有眼力。所谓眼力,就是善于从社会上时不时出现的各种热点事件中获取与事件相关的域名资源。眼力的前提是对域名领域的熟悉和丰富的知识。
tk域名是什么域名?新手对tk域名有什么看法?