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

CountDownLatch基于AQS阻塞工具用法詳解

 更新時間:2023年06月20日 10:58:44   作者:程序員札記  
這篇文章主要為大家介紹了CountDownLatch基于AQS阻塞工具用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

CountDownLatch解決了什么問題

CountDownLatch是基于AQS的阻塞工具,阻塞一個或者多個線程,直到所有的線程都執(zhí)行完成。

當(dāng)一個任務(wù)運(yùn)算量比較大的時候,需要拆分為各種子任務(wù),必須要所有子任務(wù)完成后才能匯總為總?cè)蝿?wù)。
使用并發(fā)模擬的時候可以使用CountDownLatch.也可以設(shè)置超時等待時間,

CountDownLatch 用法

package com.conrrentcy.juc;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CountDownLatchExample {
    private static final Logger log = LoggerFactory.getLogger(CountDownLatchExample.class);
     //線程數(shù)量
    private static final int THREAD_NUM = 10;
    // CountdownLatch阻塞模擬
    public static void main(String[] args) throws InterruptedException {
        // 創(chuàng)建線程池 用于執(zhí)行線程
        ExecutorService executorService = Executors.newCachedThreadPool();
        //創(chuàng)建countDownLatch
        final CountDownLatch countDownLatch = new CountDownLatch(THREAD_NUM);
        long startTime = System.currentTimeMillis();
        //循環(huán)創(chuàng)建線程
        for (int i = 0; i < THREAD_NUM; i++) {
            final int a = i;
            executorService.execute(() -> {
                try {
                    test(a);
                } catch (Exception e) {
                    log.error("Exception", e);
                } finally {
                    countDownLatch.countDown();
                }
            });
        }
        countDownLatch.await();
        long endTime = System.currentTimeMillis();
        log.info("執(zhí)行完畢,{}-{}",startTime,endTime);
        executorService.shutdown();
    }
    private static void test(int num) throws InterruptedException {
        Thread.sleep(100);
        log.info("{}-{}", num,System.currentTimeMillis());
        Thread.sleep(100);
    }
}

阻塞所有線程執(zhí)行完成后再執(zhí)行

CountDownLatch源碼解析

CountDownLatch源碼中的方法和屬性并不多,下面我們來一一解析。

1.AQS框架以及構(gòu)造方法

//當(dāng)前對象中私有阻塞工具
private final Sync sync;
// 模板方法模式重寫AQS工具
private static final class Sync extends AbstractQueuedSynchronizer {
   private static final long serialVersionUID = 4982264981922014374L;
   // 共享阻塞AQS
   Sync(int count) {
       setState(count);
   }
   // 獲取當(dāng)前還剩多少資源可以使用
   int getCount() {
       return getState();
   }
   protected int tryAcquireShared(int acquires) {
       return (getState() == 0) ? 1 : -1;
   }
   protected boolean tryReleaseShared(int releases) {
       for (;;) {
           int c = getState();
           if (c == 0)
               return false;
           int nextc = c-1;
           if (compareAndSetState(c, nextc))
               return nextc == 0;
       }
   }
}
//構(gòu)造方法創(chuàng)建一個鎖對象
public CountDownLatch(int count) {
   if (count &lt; 0) throw new IllegalArgumentException("count &lt; 0");
   this.sync = new Sync(count);
}

2. countDown()方法解析

該方法用于線程執(zhí)行完畢后減計統(tǒng)計數(shù)量,

// 該方法時釋放一個共享鎖。當(dāng)所有鎖都被釋放完成后主線程就能繼續(xù)執(zhí)行了。
public void countDown() {
    sync.releaseShared(1);
}

3.await()方法解析

//攔截主線程的方法。主線程在這里等待條件達(dá)成后繼續(xù)執(zhí)行。
public void await() throws InterruptedException {
    //在這里阻塞線程的執(zhí)行
    sync.acquireSharedInterruptibly(1);
}
public final void acquireSharedInterruptibly(int arg)
       throws InterruptedException {
   if (Thread.interrupted())
       throw new InterruptedException();
    //這里判斷是否還有可以共享的資源
   // 如果有則返回-1 否則返回 1,重寫AQS的方法參見(1.AQS框架以及構(gòu)造方法)
   if (tryAcquireShared(arg) < 0)
       // 有資源則運(yùn)行阻塞自旋等待所有線程執(zhí)行完畢
       doAcquireSharedInterruptibly(arg);
   // 無資源可用就讓線程繼續(xù)執(zhí)行
}
// 帶延遲的減少數(shù)據(jù)攔截方法
// 返回的結(jié)果是沒有跑完全部線程就繼續(xù)執(zhí)行下一步了。
public boolean await(long timeout, TimeUnit unit)
    throws InterruptedException {
    return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout));
}
public final boolean tryAcquireSharedNanos(int arg, long nanosTimeout)
    throws InterruptedException {
    //線程如果被中斷則拋出異常
    if (Thread.interrupted())
        throw new InterruptedException();
    // 表示如果線程被執(zhí)行完了直接返回成功,如果沒有執(zhí)行完則看等待時間來決定是否要繼續(xù)執(zhí)行。
    return tryAcquireShared(arg) >= 0 ||
        doAcquireSharedNanos(arg, nanosTimeout);
}

再看doAcquireSharedInterruptibly

    private void doAcquireSharedInterruptibly(int arg)
        throws InterruptedException {
        final Node node = addWaiter(Node.SHARED);
        boolean failed = true;
        try {
            for (;;) {
                final Node p = node.predecessor();
                if (p == head) {
                    int r = tryAcquireShared(arg);
                    if (r &gt;= 0) {
                        setHeadAndPropagate(node, r);
                        p.next = null; // help GC
                        failed = false;
                        return;
                    }
                }
                if (shouldParkAfterFailedAcquire(p, node) &amp;&amp;
                    parkAndCheckInterrupt())
                    throw new InterruptedException();
            }
        } finally {
            if (failed)
                cancelAcquire(node);
        }
    }

下面是具體的流程

CountDownLatch 總結(jié)

CountDownLatch這個類能夠使一個線程等待其他線程完成各自的工作后再執(zhí)行。 在分散計算統(tǒng)一合成結(jié)果,按某個流程加載資源的方面有著非誠好用的效果。CountDownLatch是不能夠重用的,如果需要重新計數(shù),可以考慮使用CyclicBarrier或者創(chuàng)建新的CountDownLatch實(shí)例

下一篇我們講解像蓄水池一樣功能的Semphore,更多關(guān)于CountDownLatch AQS用法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Mybatis Mapper接口和xml綁定的多種方式、內(nèi)部實(shí)現(xiàn)原理和過程解析

    Mybatis Mapper接口和xml綁定的多種方式、內(nèi)部實(shí)現(xiàn)原理和過程解析

    在Mybatis中,我們需要創(chuàng)建一個與實(shí)體類對應(yīng)的Mapper接口,然后在該接口上添加方法,這些方法對應(yīng)著SQL語句,這篇文章主要介紹了Mybatis Mapper接口和xml綁定的多種方式、內(nèi)部實(shí)現(xiàn)原理和過程,需要的朋友可以參考下
    2023-11-11
  • Java實(shí)現(xiàn)字節(jié)字符轉(zhuǎn)bcd編碼

    Java實(shí)現(xiàn)字節(jié)字符轉(zhuǎn)bcd編碼

    BCD是一種將十進(jìn)制數(shù)字編碼為二進(jìn)制的表示方式,常用于數(shù)字顯示和存儲,本文將介紹如何在Java中實(shí)現(xiàn)字節(jié)字符轉(zhuǎn)BCD碼的過程,需要的小伙伴可以了解下
    2025-09-09
  • 在Java中編輯PowerPoint?PPTX文檔的操作過程

    在Java中編輯PowerPoint?PPTX文檔的操作過程

    構(gòu)建用于程序化編輯?Open?Office?XML文檔(如?PowerPoint、Excel?和?Word)的應(yīng)用程序從未如此簡單,在本文中,我們將專門討論?PowerPoint?演示文稿?XML(PPTX)文件的結(jié)構(gòu),并學(xué)習(xí)如何操作?PPTX?內(nèi)容的基本過程,需要的朋友可以參考下
    2025-04-04
  • Java并發(fā)編程之LongAdder執(zhí)行情況解析

    Java并發(fā)編程之LongAdder執(zhí)行情況解析

    這篇文章主要為大家介紹了Java并發(fā)編程之LongAdder執(zhí)行情況解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • springboot整合flowable框架入門步驟

    springboot整合flowable框架入門步驟

    最近工作中有用到工作流的開發(fā),引入了flowable工作流框架,在此記錄一下springboot整合flowable工作流框架的過程,感興趣的朋友一起看看吧
    2022-04-04
  • Java Executor 框架的實(shí)例詳解

    Java Executor 框架的實(shí)例詳解

    這篇文章主要介紹了Java Executor 框架的實(shí)例詳解的相關(guān)資料,這里提供實(shí)例來幫助大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下
    2017-09-09
  • SpringBoot使用Redis實(shí)現(xiàn)分布式緩存

    SpringBoot使用Redis實(shí)現(xiàn)分布式緩存

    這篇文章主要介紹了SpringBoot redis分布式緩存實(shí)現(xiàn)過程解析,文中通過示例代碼解析的非常詳細(xì),感興趣的同學(xué)可以參考閱讀
    2023-04-04
  • Java Stream 流的使用過程解析

    Java Stream 流的使用過程解析

    這篇文章主要介紹了Java Stream 流的使用過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • Java設(shè)計模式之命令模式(Command模式)介紹

    Java設(shè)計模式之命令模式(Command模式)介紹

    這篇文章主要介紹了Java設(shè)計模式之命令模式(Command模式)介紹,本文講解了Command模式的定義、如何使用命令模式等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • RabbitMQ中的Channel和Exchange詳解

    RabbitMQ中的Channel和Exchange詳解

    這篇文章主要介紹了RabbitMQ中的Channel和Exchange詳解,創(chuàng)建和銷毀TCP連接很耗時,打開太多TCP連接,耗操作系統(tǒng)資源,并發(fā)量大到一定程度,系統(tǒng)的吞吐量會降低,使用一個connection多channel的方式,可以提升連接的利用率,需要的朋友可以參考下
    2023-08-08

最新評論

东兴市| 苍溪县| 湖南省| 汽车| 丘北县| 昭通市| 图木舒克市| 同德县| 新邵县| 台中县| 建德市| 公安县| 阿勒泰市| 孟州市| 赤壁市| 吉安市| 防城港市| 定西市| 藁城市| 定襄县| 通榆县| 光山县| 芜湖市| 饶河县| 广西| 望谟县| 龙南县| 房产| 左贡县| 德化县| 岱山县| 阿鲁科尔沁旗| 临沭县| 东城区| 柘荣县| 房产| 广东省| 蓝田县| 金寨县| 西畴县| 闻喜县|