자바 스 레 드 병행 도구 류 CountDownlatch 원리 및 용법

1.CountDownlatch
[1]Countdown Latch 가 뭐 예요?
Countdown Latch 는 카운트다운 잠 금 장치 로 번역 되 며 동기 화 보조 클래스 입 니 다.다른 스 레 드 에서 실행 중인 작업 이 완료 되 기 전에 하나 또는
여러 스 레 드 가 기다 리 고 있 습 니 다.
잠 금 을 닫 으 면 스 레 드 의 진 도 를 지연 시 킬 수 있 습 니 다.잠 금 을 닫 으 면 다른 활동 이 완 료 될 때 까지 계속 실행 할 수 있 습 니 다.
4.567917.특정한 계산 이 필요 한 모든 자원 이 초기 화 된 후에 야 계속 실 행 될 수 있 도록 확보한다4.567917.특정한 서비스 가 의존 하 는 모든 다른 서비스 가 시 작 된 후에 야 시작 하도록 확보한다4.567917.특정한 조작 에 참여 한 모든 참여 자가 준비 가 다 될 때 까지 기 다 렸 다가 계속 집행 한다Countdown Latch 는 양수 계수 기 를 가지 고 있 습 니 다.countDown()방법 은 계수 기 를 줄 이 고 await()방법 은 계수 기 를 0 까지 기다 리 고 있 습 니 다.모든 await 스 레 드 는 카운터 가 0 이거 나 스 레 드 가 중단 되 거나 시간 이 초 과 될 때 까지 막 힙 니 다.
폐쇄(카운트다운 자물쇠)는 주로 어떤 임 무 를 완성 하 는 선 결 조건 을 만족 시 키 는 데 쓰 인 다.여러 스 레 드 간 의 동기 화 를 조정 하 는 동기 화 도구 클래스 입 니 다.이 도 구 는 보통 스 레 드 기다 림 을 제어 하 는 데 사 용 됩 니 다.카운트다운 이 끝 날 때 까지 스 레 드 를 기다 리 게 하고 실행 을 시작 할 수 있 습 니 다.
[2]Countdown Latch 의 두 가지 전형 적 인 용법
① 특정한 스 레 드 가 실행 되 기 전에 n 개의 스 레 드 가 실 행 될 때 까지 기다린다.
Countdown Latch 의 계수 기 를 n:new Countdown Latch(n)로 초기 화 합 니 다.작업 스 레 드 가 실 행 될 때마다 계수 기 를 1 countdownlatch.countDown()줄 이 고 카운터 의 값 이 0 으로 변 할 때마다 Countdown Latch 에서 await()의 스 레 드 가 깨 어 납 니 다.하나의 전형 적 인 응용 장면 은 서 비 스 를 시작 할 때 메 인 스 레 드 는 여러 구성 요소 가 불 러 올 때 까지 기 다 렸 다가 계속 실행 해 야 한 다 는 것 이다.
② 여러 스 레 드 에서 작업 을 시작 하 는 최대 병행 성 을 실현 합 니 다.
주 의 는 병행 성 입 니 다.병발 이 아니 라 여러 스 레 드 가 어느 순간 에 동시에 실행 되 는 것 을 강조 합 니 다.달리기 와 비슷 하 게 여러 라인 을 기점 에 놓 고 신호총 이 울 리 기 를 기다 린 뒤 동시에 달린다.공 유 된 CountDownlatch 대상 을 초기 화하 고 계수 기 를 1:new CountDownlatch(1)로 초기 화 합 니 다.여러 스 레 드 가 작업 을 시작 하기 전에 먼저 coundownlatch.awat()를 시작 합 니 다.주 스 레 드 가 countDown()을 호출 할 때 계수 기 는 0 으로 바 뀌 고 여러 스 레 드 가 동시에 깨 어 납 니 다.
다음 과 같은 예 에서 보 듯 이 다 중 스 레 드 가 운행 하 는 상황 에서 다 중 스 레 드 가 소모 하 는 시간 을 계산한다.

public class TestCountDownLatch {
  //CountDownLatch     、     
  static CountDownLatch countDownLatch = new CountDownLatch(5);

  static class LatchDemo extends Thread{
    @Override
    public void run() {
      int sum = 0;
      for (int i = 0; i < 1000000; i++) {
        sum++;
      }
      System.out.println(getName()+"    :"+sum);
      countDownLatch.countDown();
    }
  }
  public static void main(String[] args) throws InterruptedException {

    long begin = System.currentTimeMillis();
    System.out.println("   -----"+begin);
    for (int i = 0; i < 5; i++) {
      new LatchDemo().start();
    }
    countDownLatch.await();

    long end = System.currentTimeMillis();
    System.out.println("   -----"+end);
    System.out.println("    :"+(end-begin));
  }
}

/**
   -----1571144894551
Thread-3    :1000000
Thread-0    :1000000
Thread-1    :1000000
Thread-2    :1000000
Thread-4    :1000000
   -----1571144894559
    :8
*/
2.CyclicBarrier
[1]Cyclic Barrier 가 뭐 예요?
Cyclic Barrier 는 울타리 류 로 Count Downlatch 와 유사 합 니 다.그것 은 어떤 사건 이 발생 할 때 까지 스 레 드 를 막 을 수 있다.울타리 와 폐쇄 의 관건 적 인 차 이 는 모든 스 레 드 가 동시에 울타리 위치 에 도착 해 야 계속 실 행 될 수 있다 는 점 이다.
Cyclic Barrier 는 일정 수량의 스 레 드 를 울타리 위치 에서 반복 적 으로 모 을 수 있 습 니 다.스 레 드 가 울타리 위치 에 도 착 했 을 때 await 방법 을 사용 합 니 다.이 방법 은 모든 스 레 드 가 울타리 위치 에 도착 할 때 까지 차단 합 니 다.모든 스 레 드 가 울타리 위치 에 도착 하면 울타리 가 열 립 니 다.이 때 모든 스 레 드 가 풀 리 고 울 타 리 는 다음 에 사용 할 수 있 도록 초기 화 됩 니 다.
[2]CyclicBarrier 구조 방법

public CyclicBarrier(int parties) {
  this(parties, null);
}

public CyclicBarrier(int parties, Runnable barrierAction) {
  if (parties <= 0) throw new IllegalArgumentException();
  this.parties = parties;
  this.count = parties;
  this.barrierCommand = barrierAction;
}
Cyclicbarrier 의 기본 구조 방법 은 Cyclicbarrier(int parties)입 니 다.그 매개 변 수 는 장벽 이 차단 하 는 스 레 드 수량 을 표시 합 니 다.모든 스 레 드 는 await()방법 으로 Cyclicbarrier 에 게 제 가 이미 장벽 에 도 착 했 음 을 알려 주 고 현재 스 레 드 가 막 혔 습 니 다.
Cyclicbarrier 의 또 다른 구조 함수 Cyclicbarrier(int parties,Runnable barrierAction)는 스 레 드 가 장벽 에 도 착 했 을 때 barrierAction 을 우선 실행 하여 더욱 복잡 한 업무 장면 을 처리 하 는 데 편리 합 니 다.
【3】CyclicBarrier 응용 예시

public class CyclicBarrierTest {
  //        
  private static class Worker extends Thread {
    private CyclicBarrier cyclicBarrier;
    
    public Worker(CyclicBarrier cyclicBarrier) {
      this.cyclicBarrier = cyclicBarrier;
    }
    
    @Override
    public void run() {
      super.run();
      
      try {
        System.out.println(Thread.currentThread().getName() + "        ");
        cyclicBarrier.await();
        System.out.println(Thread.currentThread().getName() + "    ");
        //         ,   Thread.sleep()       
        Thread.sleep(1000);
        System.out.println(Thread.currentThread().getName() + "    ");
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
 
  public static void main(String[] args) {
    int threadCount = 3;
    CyclicBarrier cyclicBarrier = new CyclicBarrier(threadCount);
    
    for (int i = 0; i < threadCount; i++) {
      System.out.println("      " + i);
      Worker worker = new Worker(cyclicBarrier);
      worker.start();
    }
  }
}
/**
      0
      1
Thread-0        
      2
Thread-1        
Thread-2        
Thread-2    
Thread-0    
Thread-1    
Thread-1    
Thread-0    
Thread-2    
*/
위 코드 에서 사용자 정의 작업 스 레 드 는 모든 참여 스 레 드 가 시 작 된 후에 야 실 행 될 수 있 습 니 다.저 희 는 Cyclic Barrier 류 를 사용 하여 완성 할 수 있 습 니 다.프로그램의 실행 결과 에서 도 알 수 있 듯 이 모든 작업 스 레 드 가 await()방법 을 실행 한 후에 울타리 위치 에 도착 한 후에 야 3 개의 작업 스 레 드 가 업무 처 리 를 시작 했다.
[4]Cyclic Barrier 와 Count Downlatch 의 차이
  • Countdown Latch 의 계수 기 는 한 번 만 사용 할 수 있 고 Cyclicbarrier 의 계수 기 는 reset()방법 으로 리 셋 할 수 있 으 며 여러 번 사용 할 수 있 기 때문에 Cyclicbarrier 는 더욱 복잡 한 장면 을 처리 할 수 있 습 니 다
  • CyclicBarrier 는 다른 유용 한 방법 도 제공 했다.예 를 들 어 getNumberWaiting()방법 은 CyclicBarrier 가 막 힌 스 레 드 수량 을 얻 을 수 있 고 isBroken()방법 은 막 힌 스 레 드 가 중단 되 었 는 지 알 수 있다
  • Countdown Latch 는 하나의 스 레 드 나 여러 스 레 드 가 하나의 이벤트 가 발생 하 기 를 기다 리 는 것 을 허용 하고 CyclicBarrier 는 다른 스 레 드 가 울타리 위치 로 실행 되 기 를 기다 리 는 데 사 용 됩 니 다
  • 3.Semaphore
    [1]Semaphore 가 뭐 예요?
    신 호 량(Semaphore)은 신호등 이 라 고도 불 리 며 다 중 스 레 드 환경 에서 각 스 레 드 를 조율 하여 공공 자원 을 정확 하고 합 리 적 으로 사용 할 수 있 도록 한다.신 호 량 은 하나의 허가 집합 을 유지 합 니 다.저 희 는 Semaphore 를 초기 화 할 때 이 허가 집합 에 수량 값 을 입력 해 야 합 니 다.이 수량 값 은 같은 시간 에 공유 자원 에 접근 할 수 있 는 스 레 드 수량 을 대표 합 니 다.
    【2】Semaphore 기본 용법
    스 레 드 는 acquire()방법 을 통 해 허 가 를 받 은 다음 에 공유 자원 을 조작 할 수 있 습 니 다.허가 집합 이 할당 되 었 다 면 스 레 드 는 대기 상태 에 들 어 갈 것 입 니 다.다른 스 레 드 가 허 가 를 방출 할 때 까지 허 가 를 받 을 수 있 습 니 다.스 레 드 는 release()방법 으로 완성 할 수 있 고'허가'는 Semaphore 에 게 반 환 됩 니 다.
    【3】Semaphore 상호 배척 자물쇠 실현
    
    public class TestSemaphore {
      //    1,     
      private final static Semaphore mutex = new Semaphore(1);
    
      static class thread extends Thread{
        @Override
        public void run() {
          try {
            mutex.acquire();
            System.out.println(getName()+"    ");
          } catch (InterruptedException e) {
            e.printStackTrace();
          }finally {
            //       
            mutex.release();
            System.out.println("   !!!");
          }
        }
      }
      public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
          new Thread(new thread(),String.valueOf(i)).start();
        }
      }
    }
    하나의 수량 이 1 인 상호 배척 신 호 량 Semaphore 를 만 든 다음 에 10 개의 스 레 드 를 동시에 실행 합 니 다.스 레 드 에서 Semaphore 를 이용 하여 스 레 드 의 병행 을 제어 합 니 다.신 호 량 수치 가 1 밖 에 없 기 때문에 매번 한 스 레 드 만 실행 할 수 있 고 다른 스 레 드 는 대기 상태 에 들 어 갑 니 다.
    4.Callable,Future 와 Future Task

    Future 인 터 페 이 스 는 일반적으로 Callable 이 실행 한 상 태 를 되 찾 는 데 사 용 됩 니 다.그 중의 주요 방법:
  • cancel,Callable 의 실행 을 취소 합 니 다.Callable 이 완료 되 지 않 았 을 때
  • get,Callable 의 반환 치 획득
  • isCanceled,취소 여 부 를 판단 합 니 다isDone,완성 여부 판단이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기