Java併發之CountDownLatch
阿新 • • 發佈:2018-12-14
CountDownLatch是一個同步輔助類,可以使用它做一個類似於計數器的功能,在完成一組正在其他執行緒中執行的操作之前,它允許一個或多個執行緒一直等待。
典型的應用場景:
- 有一個任務想要往下執行,但必須要等到其他的任務執行完畢後才可以繼續往下執行。
CountDownLatch類中最重要的三個方法。
public void await() throws InterruptedException { }; //呼叫await()方法的執行緒會被掛起,它會等待直到count值為0才繼續執行 ### 初始值需要等待的事件的數量
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { }; //和await()類似,只不過等待一定的時間後count值還沒變為0的話就會繼續執行 就是過了超時時間後,就不再掛起等待,而是繼續執行。
public void countDown() { }; //將count值減1 某一個事件在結束
例如:
import java.util.concurrent.CountDownLatch;
public class Test {
public static void main(String[] args) {
final CountDownLatch latch = new CountDownLatch(2);
new Thread() {
public void run() {
try {
System.out.println("子任務" + Thread.currentThread().getName() + "正在進行");
Thread.sleep(2000);
System.out.println("子任務" + Thread.currentThread(). getName() + "完成");
latch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
;
}.start();
new Thread() {
public void run() {
try {
System.out.println("子任務" + Thread.currentThread().getName() + "正在進行");
Thread.sleep(2000);
System.out.println("子任務" + Thread.currentThread().getName() + "完成");
latch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
;
}.start();
try {
System.out.println("等待2個子任務完成...");
latch.await();
System.out.println("2個子任務已經完成");
System.out.println("繼續執行當前任務");
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
允許結果:
等待2個子任務完成...
子任務Thread-0正在進行
子任務Thread-1正在進行
子任務Thread-0完成
子任務Thread-1完成
2個子任務已經完成
繼續執行當前任務