最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java阻塞隊(duì)列四組API介紹(小結(jié))

 更新時(shí)間:2020年05月02日 10:33:24   作者:kaizi1992  
這篇文章主要介紹了Java阻塞隊(duì)列四組API介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

通過(guò)前面幾篇文章的學(xué)習(xí),我們已經(jīng)知道了Java中的隊(duì)列分為阻塞隊(duì)列和非阻塞隊(duì)列以及常用的七個(gè)阻塞隊(duì)列。如下圖:

本文來(lái)源:凱哥Java(kaigejava)講解Java并發(fā)系列之阻塞隊(duì)列教程。系列文章,歡迎大家從第一篇文章開(kāi)始看起。

在查看以上七個(gè)隊(duì)列的API的時(shí)候,我們可以很明顯的看到以下四組API:

  • add()/remove()/remove
  • offer()/poll()/peek()
  • put/take()
  • offer(e,time,unit)/poll(time,unit).

分別對(duì)應(yīng)的是,添加元素和移除元素以及檢查隊(duì)首元素。

這四組API各有什么不同呢?凱哥把這四組API看作是人的一生四個(gè)階段,分別是:

少年時(shí)期,初生牛犢不怕虎,一言不合就開(kāi)干,對(duì)應(yīng)的是第一組API:會(huì)拋異常的API;

青年時(shí)期,吸取各方面的知識(shí),為人處事會(huì)圓滑,對(duì)應(yīng)的是第二組API:有返回值,不拋出異常的;

中年時(shí)期,三十而立,咬定青山不放松,對(duì)應(yīng)的是第三組API:阻塞,一直等待;

老年時(shí)期,看透人生,順其自然,對(duì)應(yīng)的是第四組API:阻塞,當(dāng)?shù)搅祟A(yù)定的超時(shí)時(shí)間,退出。

下面我們就來(lái)詳細(xì)講解這四組API

第一組API,會(huì)拋出異常的:一言不合就開(kāi)干

添加元素:add(e):

當(dāng)隊(duì)列未滿(mǎn)的時(shí)候,向隊(duì)列中添加元素正常;當(dāng)隊(duì)列滿(mǎn)的時(shí)候,再向隊(duì)列中添加元素的話(huà),會(huì)拋出throw new IllegalStateException("Queue full");異常。

代碼演示及運(yùn)行結(jié)果:

源碼分析:

從源碼中,我們可以看到,調(diào)用的是offer(e)方法,在下文中,我們也會(huì)講解到的。如果offer方法返回true的話(huà),就直接返回,否則就拋出:throw new IllegalStateException("Queue full");異常的。

刪除元素:remove()

當(dāng)隊(duì)列不為空的時(shí)候,調(diào)用該方法,返回被移除的元素;當(dāng)隊(duì)列為空的時(shí)候在調(diào)用該方法,會(huì)拋出異常。

來(lái)看看源碼:

源碼中調(diào)用了poll方法,當(dāng)獲取到的對(duì)象不為空的時(shí)候,返回獲取到的對(duì)象;如果為空的話(huà),就拋出:throw new NoSuchElementException();異常。

判斷當(dāng)前隊(duì)列的隊(duì)首元素:element()

該方法是獲取隊(duì)首元素的。當(dāng)隊(duì)列不為空的時(shí)候,返回隊(duì)列中當(dāng)前隊(duì)首元素;如果隊(duì)列為空的時(shí)候,調(diào)用該方法會(huì)拋異常的。

我們來(lái)看看源碼:

獲取隊(duì)首元素代碼演示及運(yùn)行結(jié)果如下圖:

第一組API三個(gè)方法我們都講解完了。Add/remove/element方法。最大的特點(diǎn)就是,隊(duì)列為空或者是隊(duì)列滿(mǎn)了,繼續(xù)操作隊(duì)列的話(huà),就會(huì)拋出異常。這個(gè)凱哥根據(jù)就像我們?nèi)说囊簧猩倌陼r(shí)期一樣,初生牛犢不怕虎,遇到什么不服的或者是不順心的就暴躁了,碰不得,一碰就爆炸。一言不合就開(kāi)干!

第二組:帶有返回值的,不會(huì)拋出異常:為人處事會(huì)圓滑了

第二組api的不像第一組那么暴躁如雷了,不想就拋異常。第二組,不會(huì)拋出異常了。我們接著來(lái)看看:

添加元素:offer(e)

需要主要:這里的offer方法只有一個(gè)參數(shù),這個(gè)和我們后面講解的一組的區(qū)別

當(dāng)隊(duì)列未滿(mǎn)的時(shí)候,向隊(duì)列中添加元素,返回true;當(dāng)隊(duì)列已經(jīng)滿(mǎn)了,繼續(xù)向隊(duì)列中添加元素的話(huà),不會(huì)拋出異常,會(huì)返回false.

源碼分析:

從源碼中,我們可以看到,offer(e)的方法中,有個(gè)count計(jì)數(shù)器,每次添加元素后,都會(huì)count++。當(dāng)count的值等于隊(duì)列的長(zhǎng)度的時(shí)候,返回false.而不是拋出異常。我們來(lái)用代碼演示.

Offer(e)添加元素代碼演示及運(yùn)行結(jié)果:

刪除元素:poll()

注意:參數(shù)為空哦!

當(dāng)隊(duì)列不為空的時(shí)候,返回被移除的元素,當(dāng)隊(duì)列為空的時(shí)候,返回null.而不是拋出異常。

源碼分析:

從源碼中,我們將看到count這個(gè)計(jì)數(shù)器又起作用了。先判斷count是否==0

如果不等于0,調(diào)用dequeue方法,count--,然后將獲取到的元素返回;

如果count == 0的話(huà),直接返回null.

源碼如下圖:

代碼演示及運(yùn)行結(jié)果:

獲取隊(duì)首元素:peek()

當(dāng)隊(duì)列不為空的時(shí)候,返回當(dāng)前隊(duì)列的隊(duì)首元素;如果隊(duì)列為空的時(shí)候,返回null,而不是拋出異常。

源碼分析:

在源碼中,我們可以看到調(diào)用了itemAt(takeIndex)方法。但是在這個(gè)方法后面有這么已經(jīng)注釋?zhuān)簄ull when queue is empty。源碼如下圖:

代碼演示:

從運(yùn)行的結(jié)果,我們可以看到,當(dāng)移除最后一個(gè)元素:kaigejava的時(shí)候,獲取到的隊(duì)首元素已經(jīng)為null了。因?yàn)殛?duì)列為空了,所以,就算后面還有循環(huán),獲取到的隊(duì)首元素依然是null,而不是拋出異常。運(yùn)行結(jié)果如下圖:

從第二組API中,我們可以看到,不像第一組那么極端了。當(dāng)隊(duì)列為空或者是隊(duì)列滿(mǎn)的時(shí)候,返回?cái)?shù)據(jù)告知對(duì)象。這個(gè)就像我們?nèi)松缮倌陼r(shí)代,進(jìn)入了青年時(shí)代,經(jīng)過(guò)學(xué)校的洗禮之后,為人處事學(xué)會(huì)了圓滑了。

接下來(lái),我們就該進(jìn)入人生第三個(gè)階段:中年時(shí)代,我們一起來(lái)看看這個(gè)階段的api又是什么樣子的

第三組:阻塞,一直等待:三十而立,咬定青山不放松

第三組API,相對(duì)于第一組和第二組最大的區(qū)別就是:第三組會(huì)等待著,如果不被中斷,就會(huì)等到天荒地老。

添加元素:put(e)

當(dāng)隊(duì)列滿(mǎn)的時(shí)候,進(jìn)入阻塞等待狀態(tài),一直等待,直到可以添加到隊(duì)列中為止。

需要說(shuō)明:在阻塞等待過(guò)程中,有可能會(huì)被中斷,所以會(huì)拋出中斷異常:throws InterruptedException。

我們先來(lái)看看源碼:

在源碼中,我們會(huì)看到while循環(huán)來(lái)判斷count的值是否等于隊(duì)列的長(zhǎng)度,如果不等于,就enqueue.然后count++;如果count的值等于隊(duì)列的長(zhǎng)度的是,就調(diào)用notFull.await()方法,而notfull是condition對(duì)象。在之前的文章學(xué)習(xí)中,我們知道coditon.await()方法會(huì)進(jìn)入阻塞狀態(tài)。源碼如下圖:

代碼演示及運(yùn)行結(jié)果:

我們可以看到,當(dāng)添加第四個(gè)元素的時(shí)候,隊(duì)列進(jìn)入了阻塞狀態(tài)。如下圖:

刪除元素:take()

當(dāng)隊(duì)列不為空的時(shí)候,返回被移除的元素;當(dāng)隊(duì)列為空的時(shí)候,進(jìn)入阻塞等待狀態(tài)。

源碼分析:

代碼演示:

這一組隊(duì)列,就像進(jìn)入中年時(shí)期的我們一樣,三十而立,要好好工作,努力工作。只要天不塌,地不陷,一直工作著。

第四組:帶有等待超時(shí)的阻塞API

如果第三組API一直阻塞等待著,你受不了的話(huà),并發(fā)大師還為我們準(zhǔn)備了第四組API,帶有超時(shí)時(shí)間的

添加元素:offer(e,time,unit)

參數(shù)說(shuō)明:

e:將要被添加到隊(duì)列中的元素

time:long類(lèi)型的。預(yù)設(shè)定的需要等待的時(shí)間

unit:TimeUnit.超時(shí)時(shí)間的單位

來(lái)看看源碼:

從源碼中我們將會(huì)看到:

判斷count的值是否等于隊(duì)列的長(zhǎng)度

如果不等于,調(diào)用enqueue方法,然后count++,返回true.

如果count==隊(duì)列的長(zhǎng)度的時(shí)候,判斷設(shè)置的等待超時(shí)時(shí)間是否小于等于0

如果等待的時(shí)間大于0的話(huà),進(jìn)入notFull.awaitNanos方法中進(jìn)行阻塞等待。

在前面文章中,我們?cè)敿?xì)講解過(guò)condition.awaitNanos這個(gè)方法。這里就不再贅述了。

當(dāng)?shù)却臅r(shí)間小于等于0的時(shí)候,就返回false.

源碼如下圖:

代碼演示:

刪除元素:poll(time,unit)

當(dāng)隊(duì)列為空的時(shí)候,進(jìn)入阻塞等待,等到超時(shí)時(shí)間的時(shí)候,返回null.退出等待。

代碼演示:

第四組API帶有等待超時(shí)時(shí)間,就像是我們?nèi)说囊簧夏陼r(shí)期,看透一切了。一切都是順其自然了,不再爭(zhēng)強(qiáng)好勝了。

總結(jié):

凱哥通過(guò)人的一生四個(gè)階段來(lái)比喻這四組API是為了讓大家更好記憶。接下來(lái),我們來(lái)進(jìn)行總結(jié):

到此這篇關(guān)于Java阻塞隊(duì)列四組API介紹(小結(jié))的文章就介紹到這了,更多相關(guān)Java阻塞隊(duì)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文理清什么是BIO以及如何使用

    一文理清什么是BIO以及如何使用

    這篇文章主要介紹了什么是BIO以及如何使用,BIO英文全名是blockingIO,也叫做阻塞IO,是最容易理解、最容易實(shí)現(xiàn)的IO工作方式,本文就來(lái)通過(guò)一些簡(jiǎn)單的示例為大家講講BIO吧,需要的朋友可以參考下
    2023-10-10
  • SpringBoot?AOP統(tǒng)一處理Web請(qǐng)求日志的示例代碼

    SpringBoot?AOP統(tǒng)一處理Web請(qǐng)求日志的示例代碼

    springboot有很多方法處理日志,例如攔截器,aop切面,service中代碼記錄等,下面這篇文章主要給大家介紹了關(guān)于SpringBoot?AOP統(tǒng)一處理Web請(qǐng)求日志的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Maven項(xiàng)目打包成war包部署到Tomcat的方法

    Maven項(xiàng)目打包成war包部署到Tomcat的方法

    這篇文章主要介紹了Maven項(xiàng)目打包成war包部署到Tomcat的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • Java thread.isInterrupted() 返回值不確定結(jié)果分析解決

    Java thread.isInterrupted() 返回值不確定結(jié)果分析解決

    這篇文章主要介紹了Java thread.isInterrupted() 返回值不確定結(jié)果分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-12-12
  • 徹底解決IDEA中SpringBoot熱部署無(wú)效的問(wèn)題(推薦)

    徹底解決IDEA中SpringBoot熱部署無(wú)效的問(wèn)題(推薦)

    這篇文章主要介紹了徹底解決IDEA中SpringBoot熱部署無(wú)效的問(wèn)題,本文給大家?guī)?lái)問(wèn)題原因分析通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-09-09
  • SpringBoot升級(jí)3.2報(bào)錯(cuò)Invalid value type for attribute ‘factoryBeanObjectType‘: java.lang.String的解決方案

    SpringBoot升級(jí)3.2報(bào)錯(cuò)Invalid value type for 

    這篇文章給大家介紹了SpringBoot升級(jí)3.2報(bào)錯(cuò)Invalid value type for attribute ‘factoryBeanObjectType‘: java.lang.String的解決方案,文中有詳細(xì)的原因分析,需要的朋友可以參考下
    2023-12-12
  • Java多線(xiàn)程之線(xiàn)程狀態(tài)詳解

    Java多線(xiàn)程之線(xiàn)程狀態(tài)詳解

    這篇文章主要介紹了Java多線(xiàn)程 線(xiàn)程狀態(tài)原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-09-09
  • java使用集合實(shí)現(xiàn)通訊錄功能

    java使用集合實(shí)現(xiàn)通訊錄功能

    這篇文章主要為大家詳細(xì)介紹了java使用集合實(shí)現(xiàn)通訊錄功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 淺談Java日志框架slf4j作用及其實(shí)現(xiàn)原理

    淺談Java日志框架slf4j作用及其實(shí)現(xiàn)原理

    日志記錄是應(yīng)用程序運(yùn)行中必不可少的一部分。這篇文章主要介紹了淺談Java日志框架slf4j作用及其實(shí)現(xiàn)原理,SLF4J是一個(gè)日志框架抽象層,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • mybatis insert foreach循環(huán)插入方式

    mybatis insert foreach循環(huán)插入方式

    這篇文章主要介紹了mybatis insert foreach循環(huán)插入方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評(píng)論

文成县| 凭祥市| 华亭县| 祁阳县| 深泽县| 宝清县| 板桥市| 浏阳市| 灵宝市| 深州市| 镇远县| 湘阴县| 乳山市| 山东| 平邑县| 家居| 莱西市| 金门县| 安乡县| 邢台县| 荆州市| 辉南县| 文山县| 罗江县| 石城县| 厦门市| 于田县| 岗巴县| 汉寿县| 贵德县| 望谟县| 合山市| 九龙城区| 保定市| 新邵县| 张家界市| 资兴市| 邢台县| 永宁县| 元江| 芷江|