java高併發之CountDownLatch,CyclicBarrier和join

         晚上打車回家,在車上看到一篇文章《22歲大學生獲谷歌天價Offer,年薪千萬!》,講的是印度一個22歲大學生屢次參加ACM大賽,開源多個項目,以很是牛逼的履歷經過了谷歌的AI測試,斬獲谷歌僅有的50個頂尖offer之一。因而感慨:一樣是大學生,爲什麼這哥們就這麼一枝獨秀呢?難道印度也有陳獨秀?爲啥本身都12年義務教育+4年大學教育+3年菸酒僧教育了,連人家個零頭都掙不了啊?真巴不得在地上挖個洞鑽進去。不行,今晚必須輸出篇博客安慰下被打擊的心!想到這裏頓時酒也醒了(老大走了,今晚幾個同事送他,喝了點酒),心也再也不那麼傷感了,決定把今天get的一些知識點作個梳理,知識是一點點積累起來的,比你牛逼的人比你還努力,你還有什麼資格不努力?mysql

        早上看了下CountDownLatch和CyclicBarrier的用法和區別,講到CountDownLatch又想到了Thread.join()方法,就來說講這3兄弟的功能,特色&&用法,講的不對的地方歡迎指正。sql

              1、CountDownLatch:mysql索引

                        功能:同步輔助類,也能夠理解爲倒計時鎖,用於同步線程狀態,容許一個或多個線程,等待其餘一組線程完成操做,再繼續往下執行。測試

                        特色:不可複用!spa

                        重要方法:countDown()方法:計數器-1,每次線程執行完後調用;await()方法:等待方法,在須要阻塞的地方調用,當全部線程都執行完後,自動往下執行.net

                        用法:構造的時候指定一個計數器的值,每一個線程執行完後就減1,直到爲0再往下走。以下:線程

                                  

                                 輸出結果:blog

                                 

                                 能夠看到:2個子線程分別睡眠了3s和5s,而主線的打印的「全部現場執行完畢」倒是在全部子線程執行完成後才輸出的,緣由就是阻塞在了latch.await()方法,這個方法會等到全部線程都執行完才往下執行,阻塞的原理後面有空再研究分析索引

          2、CyclicBarrier(循環柵欄):接口

                        功能:同步輔助類,功能和CountDownLatch相似,用於同步線程狀態,容許一組線程相互之間等待,達到一個共同點,再繼續執行。

                        特色:可複用!當組內全部線程都到達某個執行點後,count參數會被重置,因而就可重用了。

                        重要方法:await()方法:當某個線程到達某個點(好比執行完某個任務)後調用該方法,就會等待其餘線程,直到全部線程都到達這個點,再自動往下執行。還有個重載方法await(long timeOut,TimeUnit unit),用於當某個線程執行超過指定時間後還未到達某個點時,就會拋出異常,再也不等待這個線程,並往下執行。

                        用法:構造的時候指定一個線程數量的值和到達某個點後執行的動做,以下:

                                   

                            執行結果以下:

                                   

                        能夠看到:當前線程先於2個子線程打印執行結果,緣由就是CyclicBarrier針對的是一組線程之間的等待,await方法會等待該組內全部線程都執行完畢再往下執行,Runnable接口裏定義的動做是在全部線程執行完畢後,隨機選擇一個線程來執行

             3、join()方法:

                        join方法也是管理線程狀態同步的一個方法,和CountDownLatch和CyclicBarrier均由自身調用不一樣的是,join的調用者爲當前線程,後面的線程必須等調用join的線程執行完後才能執行。參考例子以下:

                        

 

                        執行結果:

                               

 

                       結果分析:新建立了2個線程,每一個線程的執行功能和時間是同樣的,因爲調用了join,主線程確實是在調用join的2個線程執行後纔開始執行的

             3者區別:

                        一、CountDownLatch不可複用,當計數器減爲0後,只能從新構造新的計數器,CyclicBarrier能夠複用,緣由上面已說。

                        二、CyclicBarrier針對的是一組線程之間的等待,是組內等待關係,CountDownLatch針對的是一個線程等待別的一組線程的關係,是組間等待關係。

                        三、join方法和CountDownLatch方法功能相似,可是join方法不如CountdownLatch控制靈活,能夠參考:https://blog.csdn.net/zhutulang/article/details/48504487

           原本還想講講volatile關鍵字的原理和特性,以及activeMQ中quene,topic和virtualTop之間的區別和用法的,以及mysql索引結構的實現原理的,時間不夠了,明早還要去申請廉租房得早起,下次再講吧。

相關文章
相關標籤/搜索