【Java併發】Java併發之CountDownLatch

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個子任務已經完成
繼續執行當前任務
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章