#飞利浦·斯塔克#Java阻塞队列四组API介绍( 三 )
接下来 , 我们就该进入人生第三个阶段:中年时代 , 我们一起来看看这个阶段的api又是什么样子的
第三组:阻塞 , 一直等待:三十而立 , 咬定青山不放松第三组API , 相对于第一组和第二组最大的区别就是:第三组会等待着 , 如果不被中断 , 就会等到天荒地老 。
添加元素:put(e)
当队列满的时候 , 进入阻塞等待状态 , 一直等待 , 直到可以添加到队列中为止 。
需要说明:在阻塞等待过程中 , 有可能会被中断 , 所以会抛出中断异常:throws InterruptedException 。
我们先来看看源码:
在源码中 , 我们会看到while循环来判断count的值是否等于队列的长度 , 如果不等于 , 就enqueue.然后count++;如果count的值等于队列的长度的是 , 就调用notFull.await()方法 , 而notfull是condition对象 。 在之前的文章学习中 , 我们知道coditon.await()方法会进入阻塞状态 。 源码如下图:
代码演示及运行结果:
我们可以看到 , 当添加第四个元素的时候 , 队列进入了阻塞状态 。 如下图:
删除元素:take()
当队列不为空的时候 , 返回被移除的元素;当队列为空的时候 , 进入阻塞等待状态 。
源码分析:
代码演示:
这一组队列 , 就像进入中年时期的我们一样 , 三十而立 , 要好好工作 , 努力工作 。 只要天不塌 , 地不陷 , 一直工作着 。
第四组:带有等待超时的阻塞API如果第三组API一直阻塞等待着 , 你受不了的话 , 并发大师还为我们准备了第四组API , 带有超时时间的
添加元素:offer(etimeunit)
参数说明:
e:将要被添加到队列中的元素
time:long类型的 。 预设定的需要等待的时间
unit:TimeUnit.超时时间的单位
来看看源码:
从源码中我们将会看到:
判断count的值是否等于队列的长度
如果不等于 , 调用enqueue方法 , 然后count++返回true.
如果count==队列的长度的时候 , 判断设置的等待超时时间是否小于等于0
如果等待的时间大于0的话 , 进入notFull.awaitNanos方法中进行阻塞等待 。
在前面文章中 , 我们详细讲解过condition.awaitNanos这个方法 。 这里就不再赘述了 。
当等待的时间小于等于0的时候 , 就返回false.
源码如下图:
代码演示:
删除元素:poll(timeunit)
当队列为空的时候 , 进入阻塞等待 , 等到超时时间的时候 , 返回null.退出等待 。
代码演示:
第四组API带有等待超时时间 , 就像是我们人的一生老年时期 , 看透一切了 。 一切都是顺其自然了 , 不再争强好胜了 。
总结:凯哥通过人的一生四个阶段来比喻这四组API是为了让大家更好记忆 。 接下来 , 我们来进行总结:
- #Java#java线程到底有多少种状态?
- 数码潮范一起跳舞吧!飞利浦派对音箱NX100、NX200全新上市
- #微信#Java全国统一卷之SpringMVC
- 科技小辛辛@三挡DPI鼠标从39.9降至11.9,性价比极高!,飞利浦也有真香时刻
- 『手机之友TB』巧夺天工,飞利浦E258C参数大全
- #Java#Java中的自动装箱和拆箱
- 『科技圈里那些事Y』飞利浦跳水后也有极致性价比,这款无线鼠标目前值了,从79降至19
- 小米内测师▲戴森:幸好不是对标我,小米新品搞事情!899元硬刚1999元飞利浦
- 『IT之家』sRGB,1399元,飞利浦推出新款23.8英寸显示器:2Ku002F116%
- 「搞机科技会所」五一外出游玩必备好物,飞利浦摩天轮延长线