談談你對CountDownLatch的理解(不看後悔,一看必懂)
CountDownLatch是java.util.concurrent包中一個工具類。它能夠使一個或者多個執行緒等待另外一些執行緒完成各自的工作之後,再繼續執行
使用CountDownLatch的一些情景:
①需要去解析一個Excel的資料,為了更快的解析,每個sheet都使用一個執行緒進行解析,但是最後彙總資料的工作需要等待每個sheet的解析工作完成之後才能進行
②開啟多個執行緒分塊傳輸一個大資料包,每個執行緒只傳輸固定的一截,最後由另外一個執行緒拼接所有的分塊
③啟動一個服務時,主執行緒需要等待多個元件載入完畢,之後再繼續執行。
CountDownLatch類實際上是使用計數器的方式去控制的計數器初始值為執行緒的數量。當每一個執行緒完成自己任務後,計數器的值就會減一。當計數器的值為0時,表示所有的執行緒都已經完成了任務,然後在CountDownLatch上等待的執行緒就可以恢復執行任務。
CountDownLatch的不足
CountDownLatch是一次性的,計數器的值只能在構造方法中初始化一次,之後沒有任何機制再次對其設定值,當CountDownLatch使用完畢後,它不能再次被使用
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException{
CountDownLatch countDownLatch = new CountDownLatch
@Override
public void await() throws InterruptedException {
super.await();
System.out.println(Thread.currentThread().getName() + " count down is ok");
}
};
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
//do something
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " is done");
countDownLatch.countDown();
}
}, "thread1");
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
//do something
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " is done");
countDownLatch.countDown();
}
}, "thread2");
thread1.start();
thread2.start();
countDownLatch.await();
}
}
輸出結果
thread1 is done
thread2 is done
main count down is ok