(十)java多線程之CountDownLatch

本人郵箱: <kco1989@qq.com>
歡迎轉載,轉載請註明網址 http://blog.csdn.net/tianshi_kco
github: https://github.com/kco1989/kco
代碼已經所有託管github有須要的同窗自行下載java

引言

有一個同步助手,可讓一個或一些線程等待直到另一些線程執行完一些操做.這就是CountDownLatchgit

理論

CountDownLatch在初始化的時候須要一個count參數.調用await()的線程會一直等待,直到其餘線程調用countDown使count清空爲0.一般全部等待中的線程會被釋放而且後面繼續調用await的線程會當即返回.這個是一次性操做,count不能被重置的.若是想要被重置的話,就能夠參考(九)java多線程之CyclicBarriergithub

  • CountDownLatch(int count) 構造一個指定countCountDownLatch微信

  • await() 若是當前的count爲0的話,則會當即返回,不然當前線程一直等待,直到如下狀況至少發生一個多線程

    • 其餘線程調用countDown使count清空爲0dom

    • 當前線程被其餘線程中斷測試

  • await(long timeout, TimeUnit unit) 若是當前的count爲0的話,則會當即返回,不然當前線程一直等待,直到如下狀況至少發生一個spa

    • 其餘線程調用countDown使count清空爲0.net

    • 當前線程被其餘線程中斷線程

    • 指定的時間超時

  • countDown() 若是當前的count大於0,則count減1,不然,全部等待的線程從新得到執行機會

例子

咱們仍是用上一篇文章旅遊作例子吧.小明,小剛,小紅','小麗,小黑,小白他們六個最後旅遊回來時坐飛機,飛機上就有空姐啦.那麼等他們六我的下飛機以後,空姐就要考試清理垃圾啦,檢查設備等等,這些事情都必須飛機上的所有乘客下機以後才能作.行,按照這個場景,咱們編寫一下程序吧.

  • 首先,想定義一個飛機類 Airplane, 裏面包含乘客下機和空姐的清理工做

public class Airplane {
    private CountDownLatch countDownLatch;
    private Random random;
    public Airplane(int peopleNum){
        countDownLatch = new CountDownLatch(peopleNum);
        random = new Random();
    }

    /**
     * 下機
     */
    public void getOffPlane(){
        try {
            String name = Thread.currentThread().getName();
            Thread.sleep(random.nextInt(500));
            System.out.println(name + " 在飛機在休息着....");
            Thread.sleep(random.nextInt(500));
            System.out.println(name + " 下飛機了");
            countDownLatch.countDown();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void doWork(){
        try {
            String name = Thread.currentThread().getName();
            System.out.println(name + "準備作 清理 工做");
            countDownLatch.await();
            System.out.println("飛機的乘客都下機," + name + "能夠開始作 清理 工做");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}
  • 最後,就能夠直接寫測試類

public class TestMain {

    public static void main(String[] args) {
        String visitor = "明剛紅麗黑白";
        String kongjie = "美惠花";

        Airplane airplane = new Airplane(visitor.length());
        Set<Thread> threads = new HashSet<>();
        for (int i = 0; i < visitor.length(); i ++){
            threads.add(new Thread(() -> {
                airplane.getOffPlane();
            }, "小" + visitor.charAt(i)));
        }
        for (int i = 0; i < kongjie.length(); i ++){
            threads.add(new Thread(() ->{
                airplane.doWork();
            }, "小" + kongjie.charAt(i) + "空姐"));
        }

        for (Thread thread : threads){
            thread.start();
        }
    }
}

運行一下結果:

小花空姐準備作 清理 工做
小惠空姐準備作 清理 工做
小美空姐準備作 清理 工做
小麗 在飛機在休息着....
小明 在飛機在休息着....
小白 在飛機在休息着....
小剛 在飛機在休息着....
小剛 下飛機了
小明 下飛機了
小黑 在飛機在休息着....
小麗 下飛機了
小紅 在飛機在休息着....
小紅 下飛機了
小白 下飛機了
小黑 下飛機了
飛機的乘客都下機,小花空姐能夠開始作 清理 工做
飛機的乘客都下機,小美空姐能夠開始作 清理 工做
飛機的乘客都下機,小惠空姐能夠開始作 清理 工做

經過結果能夠發現,空姐都是等全部的乘客下飛機以後,才作清理工做的.結果正確,無毛病.

打賞

若是以爲個人文章寫的還過得去的話,有錢就捧個錢場,沒錢給我捧我的場(幫我點贊或推薦一下)
微信打賞
支付寶打賞

相關文章
相關標籤/搜索