CountDownLatch類放在java.util.concurrent包下,利用它能夠實現相似的計數器的功能。相似有一個任務A,它要等待其餘4個任務執行完成以後才能執行,此時就能夠利用CountDownLatch來實現這種功能了。CountDownLatch是經過一個計數器來實現的,計數器的初始變量線程的數量。每當一個線程完成了本身的任務後,計數器的值就會減1。當計數器值到達0時,它表示全部的線程已經完成了任務,而後在閉鎖上等待的線程就能夠恢復執行任務。java
countDownLatch是在java1.5被約會,跟它一塊兒被約會的工具類還有CyclicBarrier,Semaphore,concurrentHashMap和BlockingQueue。存在於java.util.concurrent包下。app
public class CountDownLatchExample {
ide
// 循環次數
工具
private static final int FOR_NUMBER = 5;
spa
public static void main(String[] args) {
線程
// 查詢數據
3d
for (int i = 0; i < FOR_NUMBER; i++) {
code
new Thread(() -> {
orm
System.out.println("查詢第:\t" + Thread.currentThread().getName() + "張表數據完成!");
blog
}, String.valueOf(i)).start();
}
System.out.println("查詢完畢");
}
}
能夠看到,還有數據沒查詢完成他就體檢進行查詢完成的操做了。那若是在實際開發過程當中,就等於數據還沒處理完成就返回用戶數據了。這並非咱們想要的結果。
那麼剛纔也有說CountDownLatch是多個一個或多個線程等待其餘線程完成操做,那麼咱們試一下。
public class CountDownLatchExample {
// 循環五次
private static final int FOR_NUMBER = 5;
// 實例化定義一個CountDownLatch須要減小的總次數
private static CountDownLatch countDownLatch = new CountDownLatch(5);
public static void main(String[] args) {
// 查詢數據
for (int i = 0; i < FOR_NUMBER; i++) {
new Thread(() -> {
System.out.println("查詢第:\t" + Thread.currentThread().getName() + "張表數據完成!");
// 執行完 查詢 而後進行遞減操做 每次減1
countDownLatch.countDown();
}, String.valueOf(i)).start();
}
try {
countDownLatch.await(); // await()方法起到阻塞的做用,直到計數器值等於0
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("查詢完畢");
}
}
突破實現:
有參構造傳的是int類型數據
await方法: await()方法合併的做用,直到計數器值等於0才能走下面的邏輯
*若是新計數爲零,則全部等待線程都將從新啓用*線程調度目的。*若是當前計數等於零,則不會發生任何事情。countDown方法::若是當前計數大於零,則將其遞減。
getCount方法:返回當前計數