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

資訊專欄INFORMATION COLUMN

AQS同步組件--CountDownLatch

jackzou / 1809人閱讀

摘要:當計數器值到達時,它表示所有的線程已經完成了任務,然后在閉鎖上等待的線程就可以恢復執行任務。這個類使用線程在達到某個條件后繼續執行的情況。

CountDownLatch

CountDownLatch是在java1.5被引入的,跟它一起被引入的并發工具類還有CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue,它們都存在于java.util.concurrent包下。CountDownLatch這個類能夠使一個線程等待其他線程完成各自的工作后再執行。例如,應用程序的主線程希望在負責啟動框架服務的線程已經啟動所有的框架服務之后再執行。
CountDownLatch是通過一個計數器來實現的,計數器的初始值為線程的數量。每當一個線程完成了自己的任務后,計數器的值就會減1。當計數器值到達0時,它表示所有的線程已經完成了任務,然后在閉鎖上等待的線程就可以恢復執行任務。

調用CountDownLatch類的await()方法會一直阻塞,直到其他線程調用CountDown()方法使計數器的值減1,當計數器的值等于0則當因調用await()方法處于阻塞狀態的線程會被喚醒繼續執行。計數器是不能被重置的。這個類使用線程在達到某個條件后繼續執行的情況。比如并行計算,計算量特別大,我可以將計算量拆分成多個線程進行計算,最后將結果匯總。

一個CountdownLatch 例子

@Slf4j
public class CountDownLatchExample1 {

    private final static int threadCount = 200;

    public static void main(String[] args) throws Exception {

        ExecutorService exec = Executors.newCachedThreadPool();

        final CountDownLatch countDownLatch = new CountDownLatch(threadCount);

        for (int i = 0; i < threadCount; i++) {
            final int threadNum = i;
            exec.execute(() -> {
                try {
                    test(threadNum);
                } catch (Exception e) {
                    log.error("exception", e);
                } finally {
                    countDownLatch.countDown();
                }
            });
        }
        countDownLatch.await();
        log.info("finish");
        exec.shutdown();
    }

    private static void test(int threadNum) throws Exception {
        Thread.sleep(100);
        log.info("{}", threadNum);
        Thread.sleep(100);
    }
}

我們在線程之后都調用了countDown方法,在執行log之前調用了await方法,從而來保證打印日志時一定是在所有線程執行完。假設我們不使用CountDownLatch時結果會怎么樣?

@Slf4j
public class CountDownLatchExample1 {

    private final static int threadCount = 200;

    public static void main(String[] args) throws Exception {

        ExecutorService exec = Executors.newCachedThreadPool();

        final CountDownLatch countDownLatch = new CountDownLatch(threadCount);

        for (int i = 0; i < threadCount; i++) {
            final int threadNum = i;
            exec.execute(() -> {
                try {
                    test(threadNum);
                } catch (Exception e) {
                    log.error("exception", e);
                }
//                finally {
////                    countDownLatch.countDown();
//                }
            });
        }
//        countDownLatch.await();
        log.info("finish");
//        exec.shutdown();
    }

    private static void test(int threadNum) throws Exception {
        Thread.sleep(100);
        log.info("{}", threadNum);
        Thread.sleep(100);
    }
}

這段代碼打印結果就是,一開始就打印出了finish,因為這個打印是在主線程中執行。

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

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

相關文章

  • Java 線程同步組件 CountDownLatch 與 CyclicBarrier 原理分析

    摘要:在創建對象時,需要轉入一個值,用于初始化的成員變量,該成員變量表示屏障攔截的線程數。當到達屏障的線程數小于時,這些線程都會被阻塞住。當所有線程到達屏障后,將會被更新,表示進入新一輪的運行輪次中。 1.簡介 在分析完AbstractQueuedSynchronizer(以下簡稱 AQS)和ReentrantLock的原理后,本文將分析 java.util.concurrent 包下的兩個...

    Anonymous1 評論0 收藏0
  • AQS同步組件--CyclicBarrier

    摘要:也是一個同步輔助類,它允許一組線程相互等待直到到達某個工作屏障點,通過他可以完成多線程之間的相互等待。每個線程都就緒之后才能執行后面的操作。是可重用的計數器,的使用場景和的使用場景很相似,可以用于多線程計算數據最后總計結果。 CyclicBarrier CyclicBarrier也是一個同步輔助類,它允許一組線程相互等待直到到達某個工作屏障點,通過他可以完成多線程之間的相互等待。每個線...

    Null 評論0 收藏0
  • AQS同步組件--ReentrantLock與鎖

    摘要:性能較好是因為避免了線程進入內核的阻塞狀態請求總數同時并發執行的線程數我們首先使用聲明一個所得實例,然后使用進行加鎖和解鎖操作。 ReentrantLock與鎖 Synchronized和ReentrantLock異同 可重入性:兩者都具有可重入性 鎖的實現:Synchronized是依賴jvm實現的,ReentrantLock是jdk實現的。(我們可以理解為一個是操作系統層面的實現...

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

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

    CompileYouth 評論0 收藏0
  • Java同步機制的底層實現

    摘要:在多線程編程中我們會遇到很多需要使用線程同步機制去解決的并發問題,而這些同步機制就是多線程編程中影響正確性和運行效率的重中之重。這五個方法之所以能指定同步器的行為,則是因為中的其他方法就是通過對這五個方法的調用來實現的。 在多線程編程中我們會遇到很多需要使用線程同步機制去解決的并發問題,而這些同步機制就是多線程編程中影響正確性和運行效率的重中之重。這不禁讓我感到好奇,這些同步機制是如何...

    yintaolaowanzi 評論0 收藏0

發表評論

0條評論

jackzou

|高級講師

TA的文章

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