Java多執行緒-CountDownLatch用法
阿新 • • 發佈:2019-02-08
CountDownLatch 可以立即看作一個計數器,不過計數是原子操作,也就是說同一時間只有一個執行緒能夠操作該計數器;
我們先看看該類常用的幾個方法:
你可以給它設定一個數目,呼叫該類await方法會使呼叫await的方法的執行緒處於等待狀態;直到該計數器計數為0;由此特性,我們可以將它用於一下場景:
場景:只有把所有的任務執行完畢後才執行另外一個任務
下面演示是當把三個WorkTask任務都執行完畢後才執行AllTaskDonedTask任務
public class Test{
public static void main(String[] args) {
int taskSize = 3;
//建立一個計數器,並對其初始化
final CountDownLatch doneSingle = new CountDownLatch(taskSize);
//建立一個固定執行緒池,此處執行緒池的執行緒數目和taskSize無直接關
Executor executor = Executors.newFixedThreadPool(taskSize);
//執行所有任務
for (int i = 0; i < taskSize; i++) {
executor.execute(new WorkTask(doneSingle));
}
executor.execute(new AllTaskDonedTask(countDownLatch));
}
static class WorkTask implements Runnable {
CountDownLatch mCountDownLatch;
public WorkTask(CountDownLatch countDownLatch) {
mCountDownLatch = countDownLatch;
}
@Override
public void run() {
try {
println(Thread.currentThread().getName()+" execute task....");
Thread.sleep(1000);//模擬耗時操作
mCountDownLatch.countDown();//任務執行完畢計數器減1
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//所有任務執行完畢後需要執行的任務
static class AllTaskDonedTask implements Runnable {
CountDownLatch mCountDownLatch;
public AllTaskDonedTask(CountDownLatch countDownLatch) {
mCountDownLatch = countDownLatch;
}
@Override
public void run() {
try {
mCountDownLatch.await();//此處會使當前執行緒處於等待狀態,直到3個WorkTask全部執行完畢,才會繼續執行下面
println("所有任務執行完畢我才執行");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
執行結果:
pool-1-thread-3 execute task....
pool-1-thread-1 execute task....
pool-1-thread-2 execute task....
所有任務執行完畢我才執行
從上面程式碼我們不難看出,我們在執行WorkTask任務結束時都需要對計數器減1;在AllTaskDonedTask任務執行前需要呼叫CountDownLatch.await()方法,這樣當前執行緒會處於等待狀態,直到計數器減為0時也即WorkTask任務都執行完畢後,AllTaskDonedTask方可執行。