Java多線程之CountDownLatch基礎篇

關於CountDownLatch的舉例

  • 假如我們要建造一個房子,首先我們給準備建築材料開啓一個線程,選擇建築地點開啓一個線程,招聘工人開啓一個線程,每個線程完成任務就進行彙報,當所有線程都彙報完成時我們就可以開工建房子了示例代碼如下
public class MyCountDownLatch {
    public static void main(String[] args) {

        /*此處相當於造房子的總設計師,總共需要做幾項前置準備由總設計師說了算*/
        CountDownLatch count = new CountDownLatch(3);

        new Thread(() -> {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("報告建築材料已經準備完畢");
            /*此處相當於沒個線程完成一個任務就向總設計師彙報*/
            count.countDown();
        }).start();

        new Thread(()->{
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("報告建築工地已選擇完畢");
            /*此處相當於沒個線程完成一個任務就向總設計師彙報*/
            count.countDown();
        }).start();

        new Thread(()->{
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("報告工人已招聘完畢");
            /*此處相當於沒個線程完成一個任務就向總設計師彙報*/
            count.countDown();
        }).start();

        try {
            /*這裏相當於監工,只有當所有前置準備都完成時,流程纔可以向下走,即開工建房子*/
            count.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(()->{
            System.out.println("所有前置準備已完成,現在開工建房子");
        }).start();
    }
}

上面的count.await();語句相當於阻塞了住線程和開工造房子的線程,程序執行結果如下
在這裏插入圖片描述

關於CountDownLatch的官方解釋

  • CountDownLatch在jdk1.5被引入的,在java.util.concurrent包下,CountDownLatch能夠使一個線程等待其他線程完成各自的工作後再執行,CountDownLatch是通過一個計數器來實現的,計數器的初始值爲線程的數量。每當一個線程完成了自己的任務後,計數器的值就會減1。當計數器值到達0時,它表示所有的線程已經完成了任務,然後等待的線程就可以恢復執行任務了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章