Countdown Latch 의 원리

java.lang.Concurrent 패키지 의 차단 가능 한 클래스 Countdown Latch(카운트다운 카운터)는 기본 클래스 AQS(AbstractQueued Synchronizer)표준 대기 열 동기 화 클래스 를 기반 으로 합 니 다.동기 화 상태 state 에 저 장 된 것 은 현재 계수 값 입 니 다.countDown()이 release 를 호출 하여 계수기 값 이 점차 줄 어 들 고 계수기 값 이 0 일 때 모든 대기 라인 의 차단 을 해제 합 니 다.await()는 accquie 를 호출 합 니 다.카운터 값 이 0 일 때 acquire 는 즉시 돌아 갑 니 다.그렇지 않 으 면 막 힐 것 입 니 다.
await():현재 스 레 드 를 막 고 현재 스 레 드 를 AQS 의 차단 대기 열 에 추가 합 니 다.countDown():카운터 에 대해 체감 작업 을 합 니 다.카운터 가 0 으로 줄 어 들 면 현재 스 레 드 는 차단 대기 열 에 있 는 모든 스 레 드 를 깨 웁 니 다.
package com.example.demo.concurrent;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CountDownLatchDemo implements Runnable{

    final static CountDownLatchDemo  demo =new CountDownLatchDemo();
    //    AQS     ,          5   AQS   state
    final static CountDownLatch latch=new CountDownLatch(5);
    @Override
    public void run() {
        try {
            Thread.sleep(100);
            System.out.println("finish one task");
            //  CountDownLatch            ,    1
            //AQS     release      , state   1  , state=0 ,          ,    AQS              。
            latch.countDown();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        ExecutorService pools = Executors.newFixedThreadPool(5);
        for (int i=0;i<5;i++){
            pools.execute(demo);
        }
        try {
            //      ,   AQS    ,        ;
            //                 ,  5        ,        ,    ;
            latch.await();
            System.out.println("finish All");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        pools.shutdown();
    }
}

    :
finish one task
finish one task
finish one task
finish one task
finish one task
finish All

좋은 웹페이지 즐겨찾기