在看這篇部落格之前,建議大家將aqs原始碼理清楚再來看。當然,我之前的部落格中有寫aqs。若你將aqs沒搞懂,這裡看起來就不容易理解,不然你看countdownlatch的原始碼將很簡單
countdownlatch是通過乙個計數器來實現的,當我們在new 乙個countdownlatch物件的時候需要帶入該計數器值,該值就表示了執行緒的數量。每當乙個執行緒完成自己的任務後,計數器的值就會減1。當計數器的值變為0時,就表示所有的執行緒均已經完成了任務,然後就可以恢復等待的執行緒繼續執行了。
一、成員變數
private final sync sync在countdownlatch原始碼中,只有乙個成員變數sync的物件,sync是countdownlatch的乙個內部類,這個類將是countdownlatch功能實現的核心。;
private static final class sync extends abstractqueuedsynchronizer可見sync類繼承與aqs,並重寫了其中的兩個方法tryacquireshared和tryreleaseshared方法。就是獲取資源和釋放資源的方法。int
getcount()
protected int
tryacquireshared(int acquires)
protected boolean
tryreleaseshared(int releases)
}}
1、構造方法
這個構造方法就是你在構造countdownlatch時傳入的引數,也就是計數器的值。sync(int count)
2、操作方法
tryacquireshared方法
這個很簡單,判斷計數器的值是否等於0,等於0返回1,否則返回-1。
tryreleaseshared
方法步驟如下
1、獲取計數器的值
2、如果計數器值為0,返回false
3、如果計數器值不為0,則使用cas操作將計數器值減1,如果cas操作成功,返回當前計數器值是否等於0。
二、操作方法
1、await方法
public voidawait() throws interruptedexception
public final void acquiresharedinterruptibly(int arg)await方法呼叫了aqs的acquiresharedinterruptly(1)方法,可以看到這個方法會執行我們重寫的tryacquireshared方法throws interruptedexception
我們重寫的方法就是計數器值為0返回true(說明所有執行緒都已完成任務),否則返回false(說明還有執行緒沒有完成任務)
2、帶計時器的await方法
public boolean這個方法和await方法一樣,唯一的區別就是這個方法有時間限制,當執行緒沒有在指定的時間內完成任務,await方法失效,所有執行緒都會通過await方法去執行未完的**。await(long timeout, timeunit unit)
throws interruptedexception
3、countdown方法
public voidcountdown()
public final booleancountdown方法呼叫了aqs的releaseshared方法。這個方法會呼叫我們重寫的tryreleaseshared方法。releaseshared(int arg)
return false;
}
重寫的tryrelease方法以死迴圈的方式來確認計數器的值,先將計數器減一。當計數器為0時,返回true,不然返回false。
三、countdownlatch的應用
public static void上述**有兩個執行緒去解析任務,只有當兩個執行緒都完成解析,主線程才能去解析。main(string args) throws interruptedexception
};thread t2 = new thread() catch (interruptedexception e)
system.out
.println("執行緒b
解析完成
");latch.countdown();
} };
t1.start();
t2.start();
latch.await();
system.out
.println("
所有執行緒都已經解析完成
");}
我們建立了計數器值為2的countdownlatch。在主線程解析的前面呼叫await方法,在每個執行緒完成解析後呼叫countdown方法,這樣就可以達到我們所期望的要求。
AQS之countDownLatch原始碼解析
public class countdownlatch int getcount protected int tryacquireshared int acquires protected boolean tryreleaseshared int releases private final syn...
多執行緒 CountDownLatch
countdownlatch 允許乙個或多個執行緒等待其他執行緒完成操作。應用場景 假如有這樣乙個需求,當我們需要解析乙個excel裡多個sheet的資料時,可以考慮使用多執行緒,每個執行緒解析乙個sheet裡的資料,等到所有的sheet都解析完之後,程式需要提示解析完成。在這個需求中,要實現主線程...
執行緒同步 CountDownLatch
應用場景 有乙個任務想要往下執行,但必須要等到其他的任務執行完畢後才可以繼續往下執行。假如我們這個想要繼續往下執行的任務呼叫乙個countdownlatch物件的await 方法,其他的任務執行完自己的任務後呼叫同乙個countdownlatch物件上的countdown 方法,這個呼叫await ...