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

Java使用CountDownLatch實(shí)現(xiàn)統(tǒng)計(jì)任務(wù)耗時(shí)

 更新時(shí)間:2023年06月01日 16:39:50   作者:海塔燈  
這篇文章主要為大家詳細(xì)介紹了Java如何使用CountDownLatch實(shí)現(xiàn)統(tǒng)計(jì)任務(wù)耗時(shí)的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下

1.什么是閉鎖

在介紹本篇文章之前,先介紹下什么是閉鎖?閉鎖是一種同步的工具類,可以延遲線程的進(jìn)度直到其到達(dá)終止?fàn)顟B(tài),可以把閉鎖看作是一扇門,在閉鎖到達(dá)結(jié)束狀態(tài)之前,這扇門一直是關(guān)閉的,并且沒有任何線程能通過,當(dāng)?shù)竭_(dá)結(jié)束狀態(tài)時(shí),這扇門會(huì)打開允許所有線程通過。需要注意的是,當(dāng)閉鎖到達(dá)結(jié)束狀態(tài)后,將不會(huì)再改變狀態(tài),因此這扇門將會(huì)永遠(yuǎn)保持打開狀態(tài)。閉鎖可以用來確保某些任務(wù)直到其他任務(wù)都完成才繼續(xù)執(zhí)行。

2.閉鎖的使用場(chǎng)景

閉鎖在開發(fā)過程中的用途非常廣,總結(jié)下來主要有以下幾個(gè)場(chǎng)景會(huì)用到閉鎖

2.1.確保某個(gè)計(jì)算在資源初始后再繼續(xù)執(zhí)行

在這種場(chǎng)景下我們可以使用二元閉鎖,二元閉鎖包括兩個(gè)狀態(tài),可以用來表示“資源已經(jīng)被初始化”,而所有需要用到資源R的操作都必須在這個(gè)閉鎖上等待。例如我們需要加載一個(gè)配置文件,根據(jù)配置文件去做一些操作就可以使用這種閉鎖的方式;

2.2.確保某個(gè)服務(wù)在其依賴的所有其他服務(wù)都啟動(dòng)之后才啟動(dòng)

每個(gè)服務(wù)都有一個(gè)相關(guān)的二元閉鎖。當(dāng)啟動(dòng)服務(wù)S時(shí),將首先在S依賴的其他服務(wù)閉鎖上等待,在所有依賴的服務(wù)都啟動(dòng)后會(huì)釋放閉鎖S,這樣其他依賴S的服務(wù)才能繼續(xù)執(zhí)行。例如在Android的Aidl服務(wù)綁定的時(shí)候,客戶端綁定服務(wù)端獲取Binder對(duì)象時(shí),大概會(huì)有個(gè)30ms(不精確)的延遲,如果設(shè)計(jì)SDK的時(shí)候,綁定服務(wù)端和啟動(dòng)其他調(diào)用服務(wù)端的操作又是并行的情況下,就會(huì)出現(xiàn)binder為空的情況,這里就可以使用閉鎖來實(shí)現(xiàn)。具體的實(shí)現(xiàn)手法有興趣的話下次單獨(dú)出一篇文章介紹。

2.3.等待直到某個(gè)操作的所有參與者都就緒再繼續(xù)執(zhí)行

這里舉一個(gè)大家很熟悉的例子,王者榮耀的匹配,每次匹配都需要你自己的隊(duì)友和對(duì)面的對(duì)手在內(nèi)的所有玩家都就緒后才能開始游戲,不然就會(huì)出現(xiàn)少打多的滑稽情況了。這種場(chǎng)景下,當(dāng)所有的玩家都準(zhǔn)備就緒時(shí),閉鎖將會(huì)達(dá)到結(jié)束狀態(tài)。

3. CountDownLatch

CountDownLatch 是閉鎖的一種實(shí)現(xiàn),可以在我們上面的各種場(chǎng)景中使用,它可以使一個(gè)或者多個(gè)線程等待一組事件發(fā)生,閉鎖狀態(tài)包括一個(gè)計(jì)數(shù)器,該計(jì)數(shù)器被初始化為一個(gè)正數(shù),表示需要等待的事件數(shù)量,countDown方法遞減計(jì)數(shù)器,表示有一個(gè)事件已經(jīng)發(fā)生了,而await方法會(huì)一直阻塞直到計(jì)數(shù)器達(dá)到零。這表示所有等待的事件都已經(jīng)發(fā)生,如果計(jì)數(shù)器的值非零,那么await會(huì)一直阻塞直到計(jì)數(shù)器為零,或者等待中的線程中斷,或等待超時(shí)

3.1 使用CountDownLatch統(tǒng)計(jì)多個(gè)工作線程執(zhí)行的耗時(shí)

大致原理是使用兩個(gè)閉鎖,一個(gè)開始門,一個(gè)結(jié)束門,開始門計(jì)數(shù)器初始值為1,結(jié)束門的初始值為工作線程的數(shù)量,所有工作線程首先要做的事情就是在開始門上等待,從而確保所有線程都就緒后才開始執(zhí)行,每個(gè)線程套作的最后一件事情是調(diào)用結(jié)束門的countDown方法減一。demo代碼如下所示:

  public static long timeTasks(int nThreads, final Runnable task) throws InterruptedException {
        final CountDownLatch startGate = new CountDownLatch(1);
        final CountDownLatch endGate = new CountDownLatch(nThreads);

        for (int i = 0; i < nThreads; i++){
            Thread t = new Thread(){
                public void run(){
                    try {
                        System.out.println("startGate before========");
                        startGate.await();
                        System.out.println("startGate after========");
                        try{
                            task.run();
                        }finally {
                            endGate.countDown();
                            System.out.println("endGate.countDown()========");
                        }
                    } catch (InterruptedException ignored) {}
                }
            };

            t.start();
        }

        long start = System.nanoTime();
        System.out.println("start========" + start);
        startGate.countDown();
        System.out.println("endGate before========");
        endGate.await();
        long end = System.nanoTime();
        System.out.println("end========" + end);
        return end-start;
    }

注意:上面的代碼中,也許讀者會(huì)發(fā)現(xiàn)為啥要在timeTask()中使用閉鎖,而不是線程一創(chuàng)建后就立即啟動(dòng),因?yàn)槿绻趧?chuàng)建線程后就立即啟動(dòng)他們,那么先啟動(dòng)的線程將“領(lǐng)先”后啟動(dòng)的線程,并且活躍的線程數(shù)量會(huì)隨著時(shí)間的推移而增加或者減少,競(jìng)爭(zhēng)程度也在不斷發(fā)生變化。啟動(dòng)門將使得主線程能夠同時(shí)釋放所有工作線程,而結(jié)束門則使主線程能夠等待最后一個(gè)線程執(zhí)行完成,而不是順序地等待每個(gè)線程執(zhí)行完成

到此這篇關(guān)于Java使用CountDownLatch實(shí)現(xiàn)統(tǒng)計(jì)任務(wù)耗時(shí)的文章就介紹到這了,更多相關(guān)Java CountDownLatch內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

尚志市| 万盛区| 大新县| 齐齐哈尔市| 绥芬河市| 高密市| 尉犁县| 阿坝| 桐柏县| 秭归县| 禄丰县| 安阳县| 翁牛特旗| 漾濞| 三亚市| 塔河县| 张掖市| 武冈市| 阳泉市| 什邡市| 浙江省| 鄂温| 全州县| 石家庄市| 都兰县| 三明市| 囊谦县| 抚松县| 江川县| 江阴市| 波密县| 安义县| 固阳县| 潢川县| 喀什市| 宝清县| 平乐县| 米泉市| 龙江县| 泰和县| 永寿县|