国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

(十)java多線程之CountDownLatch

陳江龍 / 2817人閱讀

摘要:本人郵箱歡迎轉載轉載請注明網址代碼已經全部托管有需要的同學自行下載引言有一個同步助手可以讓一個或一些線程等待直到另外一些線程執行完一些操作這就是理論在初始化的時候需要一個參數調用的線程會一直等待直到其他線程調用使清空為通常所有等待中的線程會

本人郵箱:
歡迎轉載,轉載請注明網址 http://blog.csdn.net/tianshi_kco
github: https://github.com/kco1989/kco
代碼已經全部托管github有需要的同學自行下載

引言

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

理論

CountDownLatch在初始化的時候需要一個count參數.調用await()的線程會一直等待,直到其他線程調用countDown使count清空為0.通常所有等待中的線程會被釋放并且后面繼續調用await的線程會立即返回.這個是一次性操作,count不能被重置的.如果想要被重置的話,就可以參考(九)java多線程之CyclicBarrier

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

await() 如果當前的count為0的話,則會立即返回,否則當前線程一直等待,直到以下情況至少發生一個

其他線程調用countDown使count清空為0

當前線程被其他線程中斷

await(long timeout, TimeUnit unit) 如果當前的count為0的話,則會立即返回,否則當前線程一直等待,直到以下情況至少發生一個

其他線程調用countDown使count清空為0

當前線程被其他線程中斷

指定的時間超時

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 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();
        }
    }
}

運行一下結果:

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

通過結果可以發現,空姐都是等所有的乘客下飛機之后,才做清理工作的.結果正確,無毛病.

打賞

如果覺得我的文章寫的還過得去的話,有錢就捧個錢場,沒錢給我捧個人場(幫我點贊或推薦一下)

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69913.html

相關文章

  • Java線程同步工具箱CountDownLatch

    摘要:多線程同步工具箱之篇前言的多線程協調工具,,,都是在多線程代碼中使用比較多的工具類之一。毫不夸張的說,這幾個類,是等同于解決多線程問的包,實在有必要添加到程序員的工具箱里面。 Java多線程同步工具箱之CountDownLatch篇 前言 Java的多線程協調工具CountDownLatch,Semaphore,CyclicBarrier,ReadWriteLock都是在多線程代碼中使...

    lufficc 評論0 收藏0
  • Java線程進階(八)—— J.U.Csynchronizer框架:CountDownLatc

    摘要:線程可以調用的方法進入阻塞,當計數值降到時,所有之前調用阻塞的線程都會釋放。注意的初始計數值一旦降到,無法重置。 showImg(https://segmentfault.com/img/remote/1460000016012041); 本文首發于一世流云的專欄:https://segmentfault.com/blog... 一、CountDownLatch簡介 CountDow...

    Elle 評論0 收藏0
  • Java線程進階(九)—— J.U.Clocks框架:AQS共享功能剖析(4)

    摘要:好了,繼續向下執行,嘗試獲取鎖失敗后,會調用首先通過方法,將包裝成共享結點,插入等待隊列,插入完成后隊列結構如下然后會進入自旋操作,先嘗試獲取一次鎖,顯然此時是獲取失敗的主線程還未調用,同步狀態還是。 showImg(https://segmentfault.com/img/remote/1460000016012541); 本文首發于一世流云的專欄:https://segmentfa...

    CompileYouth 評論0 收藏0
  • Java線程進階()—— J.U.Clocks框架:基于AQS的讀寫鎖(5)

    摘要:關于,最后有兩點規律需要注意當的等待隊列隊首結點是共享結點,說明當前寫鎖被占用,當寫鎖釋放時,會以傳播的方式喚醒頭結點之后緊鄰的各個共享結點。當的等待隊列隊首結點是獨占結點,說明當前讀鎖被使用,當讀鎖釋放歸零后,會喚醒隊首的獨占結點。 showImg(https://segmentfault.com/img/remote/1460000016012293); 本文首發于一世流云的專欄:...

    dunizb 評論0 收藏0
  • (一)java線程Phaser

    摘要:本人郵箱歡迎轉載轉載請注明網址代碼已經全部托管有需要的同學自行下載引言講完了和今天講一個跟這兩個類有點類似的移相器中引入了一種新的可重復使用的同步屏障稱為移相器擁有與和類似的功勞但是這個類提供了更加靈活的應用和都是只適用于固定數量的參與者 本人郵箱: 歡迎轉載,轉載請注明網址 http://blog.csdn.net/tianshi_kcogithub: https://github....

    eccozhou 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<