天天看點

Java多線程—CountDownLatch應用

Java的concurrent包裡面的CountDownLatch其實可以把它看作一個計數器,隻不過這個計數器的操作是原子操作,同時隻能有一個線程去操作這個計數器,也就是同時隻能有一個線程去減這個計數器裡面的值。

      你可以向CountDownLatch對象設定一個初始的數字作為計數值,任何調用這個對象上的await()方法都會阻塞,直到這個計數器的計數值被其他的線程減為0為止。

      CountDownLatch的一個非常典型的應用場景是:有一個任務想要往下執行,但必須要等到其他的任務執行完畢後才可以繼續往下執行。假如我們這個想要繼續往下執行的任務調用一個CountDownLatch對象的await()方法,其他的任務執行完自己的任務後調用同一個CountDownLatch對象上的countDown()方法,這個調用await()方法的任務将一直阻塞等待,直到這個CountDownLatch對象的計數值減到0為止。

      舉個例子,有三個勞工在為老闆幹活,這個老闆有一個習慣,就是當三個勞工把一天的活都幹完了的時候,他就來檢查所有勞工所幹的活。記住這個條件:三個勞工先全部幹完活,老闆才檢查。是以在這裡用Java代碼設計兩個類,Worker代表勞工,Boss代表老闆,具體的代碼實作如下:

 當你運作CountDownLatchDemo這個對象的時候,你會發現是等所有的勞工都幹完了活,老闆才來檢查,下面是我本地機器上運作的一次結果,可以肯定的每次運作的結果可能與下面不一樣,但老闆檢查永遠是在後面的。

運作結果:

繼續閱讀