1.概述
CountDownLatch就是一個或者一組執行緒在開始執行操作之前,必須要等到其他執行緒執行完才可以,我們舉一個例子來說明,在考試的時候,老師必須要等到所有人交了試卷才可以走,此時老師就相當于等待執行緒,而學生就好比是執行的執行緒,
注意:java中還有一個同步工具類叫做CyclicBarrier,他的作用和CountDownLatch類似,同樣是等待其他執行緒都完成了,才可以進行下一步操作,我們再舉一個例子,在打王者的時候,在開局前所有人都必須要加載到100%才可以進入,否則所有玩家都相互等待,
我們看一下區別:
CountDownLatch: 一個執行緒(或者多個), 等待另外N個執行緒完成某個事情之后才能執行, CyclicBarrier : N個執行緒相互等待,任何一個執行緒完成之前,所有的執行緒都必須等待,關鍵點其實就在于那N個執行緒(1)CountDownLatch里面N個執行緒就是學生,學生做完了試卷就可以走了,不用等待其他的學生是否完成(2)CyclicBarrier 里面N個執行緒就是所有的游戲玩家,一個游戲玩家加載到100%還不可以,必須要等到其他的游戲玩家都加載到100%才可以開局
2.簡單使用
//指定人數 CountDownLatch countDownLatch = new CountDownLatch(2); new Thread(){ @Override public void run() { super.run(); System.out.println("第一個人交卷"); //countDownLatch的count減一 countDownLatch.countDown(); } }.start(); try { //等待時間 如果countDownLatch的count=0 回傳true 否則回傳false 這里處于阻塞狀態 boolean await = countDownLatch.await(10, TimeUnit.SECONDS); System.out.println(await); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("考試結束");
運行結果

3.原理
CountDownLatch主要使用countDown方法進行減1操作,使用await方法進行等待操作
countDown

OK,到了這一步我們可能會納悶,sync是個什么鬼,releaseShared方法又是如何實作的,我們不妨接著看原始碼

在這里我們發現繼承了AbstractQueuedSynchronizer(AQS),AQS的其中一個作用就是維護執行緒狀態和獲取釋放鎖,在這里也就是說CountDownLatch使用AQS機制維護鎖狀態,而releaseShared(1)方法就是釋放了一個共享鎖,
await原理
不帶引數的await會一直等待,直到CountDownLatch的count為0,帶引數的await最多等待指定時間退出,如果時間沒到,CountDownLatch的count為0就立刻退出,如果CountDownLatch的count為0回傳true,否則回傳false,


轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/544680.html
標籤:Java
