最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java中CountDownLatch的用法

 更新時間:2023年05月17日 10:39:15   作者:tizzybepeacejoy  
這篇文章主要為大家詳細介紹了Java中CountDownLatch類的用法,本文通過一些簡單的示例進行了簡單介紹,感興趣的小伙伴可以跟隨小編一起了解一下

CountDownLatch使用場景

線程計數(shù)器 用于線程執(zhí)行任務,計數(shù) 等待線程結(jié)束

用法一: 等待所有的事情都做完

        //程序計數(shù)器
        CountDownLatch countDownLatch = new CountDownLatch(10000);
        //2個線程
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        AtomicInteger count = new AtomicInteger(0);
        for (int i = 0; i < 10000; i++) {
            executorService.submit(() -> {
                count.getAndIncrement();//自增
                System.out.println(Thread.currentThread().getName() + " : " + count.get());
                countDownLatch.countDown();
            });
        }
        //線程池 等待10s
        executorService.awaitTermination(10, TimeUnit.SECONDS);
        //關閉線程 其實是將線程狀態(tài)設置為中斷標志  必須等待所有線程處理完任務,才能完全關閉
        executorService.shutdown();
        //必須等待兩個線程執(zhí)行完   會一直等待下去,當然也可以設置指定時間等待超時 await(timeout);
        countDownLatch.await();
    }

始終是2個線程在做事情,等2個線程做完事情才會停止下來。

用法二:假設2個線程做事情,剛開始并行做事情,等一個執(zhí)行完成之后,另一個才能執(zhí)行(實際還是計數(shù))

        //程序計數(shù)器
        CountDownLatch countDownLatch = new CountDownLatch(1);
        Thread thread1 =new Thread(()->{
                System.out.println(" ---------------- 1  準備 ---------------- ");
                try {
                    countDownLatch.await();
                    System.out.println(" ---------------- 1  finsh  ---------------- ");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
        });
        thread1.start();
        Thread thread2 = new Thread(() -> {
                System.out.println(" ---------------- 2  準備 ---------------- ");
                try {
                    Thread.sleep(1_000);
                    System.out.println(" ---------------- 異步做事情  ---------------- ");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    countDownLatch.countDown();
                }
        });
        thread2.start();
        //main 在等main 結(jié)束  死循環(huán)
        Thread.currentThread().join();

剛開始一起在準備狀態(tài),然后分開做事情

用法三:退出條件

中斷一個線程 count 到0

        //程序計數(shù)器
        CountDownLatch countDownLatch = new CountDownLatch(1);
        Thread thread = Thread.currentThread();
        Thread thread1 = new Thread(() -> {
            try {
             Thread.sleep(10_000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 1 中斷條件1
		    countDownLatch.countDown();
        });
        thread1.start();
        countDownLatch.await();
        System.out.println(" ----------------- ");
    }

等待時間中斷

        //程序計數(shù)器
        CountDownLatch countDownLatch = new CountDownLatch(1);
        Thread thread = Thread.currentThread();
        Thread thread1 = new Thread(() -> {
            try {
             Thread.sleep(10_000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        thread1.start();
        //2 中斷條件3
        countDownLatch.await(5, TimeUnit.SECONDS);
        System.out.println(" ----------------- ");
    }

就中斷條件而言: 當前還可以父線程中斷

        //程序計數(shù)器
        Thread thread1 = new Thread(() -> {
            try {
             Thread.sleep(10_000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 中斷條件3
            thread.interrupt();
        });
        thread1.start();
        System.out.println(" ----------------- ");

用法四: 封裝結(jié)束完后通知事件

封裝結(jié)束完后通知事件 參考 CyclicBarrier 通知

public class CountDownLatchTest4 extends CountDownLatch {
    private Runnable runnable;
    public CountDownLatchTest4(int count, Runnable runnable) {
        super(count);
        this.runnable = runnable;
    }
    @Override
    public void countDown() {
        super.countDown();
        if (super.getCount()==0){
            runnable.run();
        }
    }
    public static void main(String[] args) throws InterruptedException {
        //程序計數(shù)器
        CountDownLatchTest4 countDownLatch = new CountDownLatchTest4(1,()->{
            System.out.println(" 計數(shù)結(jié)束 .... ");
        });
        Thread thread1 = new Thread(() -> {
            try {
                Thread.sleep(2_000);
                countDownLatch.countDown();
                System.out.println(" thread 1 do something ");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        Thread thread2 = new Thread(() -> {
            try {
                Thread.sleep(1_000);
                System.out.println(" thread 2 do something ");
                countDownLatch.countDown();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        thread1.start();
        thread2.start();
        countDownLatch.await();
        System.out.println("  -----------------  main 結(jié)束 ----------------- ");
    }
}

可以看到運行結(jié)束,通知事件

自定義計數(shù)器

當然我們也可以實現(xiàn)自己的計數(shù)器

/**
 * 自定義 CountDown 計數(shù)器
 */
public class CountDown {
    //計數(shù)器
    private int count = 0;
    private final int total;
    public CountDown(int total) {
        this.total = total;
    }
    public void countDown() {
        synchronized (this) {
            this.count++;
            //鎖住 ++ 通知其他線程
            this.notifyAll();
        }
    }
    public void aWait() throws InterruptedException {
        synchronized (this) {
            while (total != count) {
                //不等于 則 繼續(xù)等待
                this.wait();
            }
        }
    }
}

測試

        CountDown countDown = new CountDown( 5);
        System.out.println(" 準備多線程處理任務 ");
        IntStream.rangeClosed(1, 5).forEach(x -> {
            new Thread(() -> {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(" 線程開始 -----  " + Thread.currentThread().getName());
                countDown.countDown();
            }, x + "").start();
        });
        try {
            countDown.aWait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(" 準備多線程處理任務 結(jié)束 ");
        System.out.println(" ---------------------- ");
        System.out.println(" 結(jié)束 mian ---------- ");
    }

測試結(jié)果

最后

CountDownLatch 可以用來計數(shù),可以測試任務是否執(zhí)行結(jié)束

也可以用來停止一個線程,也可以用來線程運行結(jié)束完后通知事件,彼此工作的線程互相獨立不關心。

到此這篇關于詳解Java中CountDownLatch的用法的文章就介紹到這了,更多相關Java CountDownLatch內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家

相關文章

  • 一文詳解Java中流程控制語句

    一文詳解Java中流程控制語句

    在一個程序執(zhí)行的過程中,各條語句的執(zhí)行順序?qū)Τ绦虻慕Y(jié)果是有直接影響的。也就是說,程序的流程對運行結(jié)果有直接的影響。所以,我們必須清楚每條語句的執(zhí)行流程。本文就來通過一些示例帶大家詳細了解一下
    2022-10-10
  • 理解java和python類變量以及類的成員變量

    理解java和python類變量以及類的成員變量

    這篇文章主要幫助大家理解java和python類變量以及類的成員變量,用實例進行解析,感興趣的朋友可以參考一下
    2016-02-02
  • Java 枚舉的基本使用方法及實際使用場景

    Java 枚舉的基本使用方法及實際使用場景

    枚舉是 Java 中一種特殊的類,用于定義一組固定的常量,枚舉類型提供了更好的類型安全性和可讀性,適用于需要定義一組有限且固定的值的場景,本文給大家介紹Java 枚舉的用法及實際使用場景,感興趣的朋友一起看看吧
    2025-06-06
  • 封裝jndi操作ldap服務器的工具類

    封裝jndi操作ldap服務器的工具類

    這篇文章主要介紹了封裝JNDI操作LDAP服務器的工具類,使用者只需要會使用List,Map 數(shù)據(jù)結(jié)構(gòu),大家參考使用吧
    2014-01-01
  • 淺談Java異常的Exception e中的egetMessage()和toString()方法的區(qū)別

    淺談Java異常的Exception e中的egetMessage()和toString()方法的區(qū)別

    下面小編就為大家?guī)硪黄獪\談Java異常的Exception e中的egetMessage()和toString()方法的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • Java Cmd運行Jar出現(xiàn)亂碼的解決方案

    Java Cmd運行Jar出現(xiàn)亂碼的解決方案

    這篇文章主要介紹了Java Cmd運行Jar出現(xiàn)亂碼的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java運算符解密之位運算、移位運算舉例詳解

    Java運算符解密之位運算、移位運算舉例詳解

    這篇文章主要介紹了Java運算符解密之位運算、移位運算的相關資料,Java中的位運算符包括按位與&、按位或|、按位取反~和按位異或^,用于對數(shù)據(jù)的二進制位進行操作,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-04-04
  • Mybatis中的Criteria條件查詢方式

    Mybatis中的Criteria條件查詢方式

    這篇文章主要介紹了Mybatis中的Criteria條件查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringBoot中HTTP連接池的配置與優(yōu)化

    SpringBoot中HTTP連接池的配置與優(yōu)化

    這篇文章主要為大家詳細介紹了SpringBoot中HTTP連接池的配置與優(yōu)化的相關知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-05-05
  • Spring對事務管理的支持

    Spring對事務管理的支持

    今天小編就為大家分享一篇關于Spring對事務管理的支持,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01

最新評論

九台市| 云梦县| 嘉黎县| 舒兰市| 绥宁县| 全椒县| 盐城市| 通辽市| 顺义区| 永安市| 高雄县| 长泰县| 沧源| 宝兴县| 兴城市| 漳浦县| 登封市| 六盘水市| 饶河县| 微山县| 黄石市| 芜湖市| 那坡县| 佛坪县| 思南县| 上犹县| 龙游县| 沙洋县| 衡阳市| 漾濞| 济宁市| 星座| 绩溪县| 惠州市| 凯里市| 双流县| 平南县| 唐山市| 巴彦县| 陵水| 石嘴山市|