java 병렬 프로 그래 밍 테마(9)---(JUC)CyclicBarrier 분석

전편CountDownlatch 를 소 개 했 습 니 다.CountDownlatch 는"다른 스 레 드 에서 실행 중인 작업 이 완료 되 기 전에 하나 이상 의 스 레 드 를 기다 릴 수 있 도록 합 니 다"라 는 것 을 알 고 있 습 니 다.즉,CountDownlatch 는 1 또는 N 스 레 드 가 다른 스 레 드 가 완 료 될 때 까지 기다 릴 수 있 도록 하 는 역할 을 합 니 다.오늘 소개 할 CyclicBarrier 는 N 스 레 드 가 서로 기다 릴 수 있 도록 합 니 다.
1.CyclicBarrier 안내
Cyclic Barrier 는 순환 적 으로 사용 할 수 있 는 장벽(Barrier)을 의미한다.그것 이 해 야 할 일 은 한 조 의 스 레 드 가 하나의 장벽(동기 점 이 라 고도 할 수 있다)에 도 착 했 을 때 막 히 고 마지막 스 레 드 가 장벽 에 도 착 했 을 때 만 장벽 이 문 을 열 고 모든 장벽 에 의 해 막 힌 스 레 드 가 계속 일 할 수 있다 는 것 이다.JDK 에서 Cyclic Barrier 에 대해 이렇게 말 했다.순환 장 애 는 가끔 서로 기 다 려 야 하 는 고정 크기 의 스 레 드 프로그램 에서 유용 하 다."장벽 은 순환 이 라 고 합 니 다.스 레 드 가 풀 리 기 를 기다 린 후에 다시 사용 할 수 있 기 때 문 입 니 다."Countdown Latch 의 계수 기 를 리 셋 할 수 없습니다.Cyclic Barrier 의 계산 기 는 리 셋 되 어 사용 할 수 있 기 때문에 순환 의 barrier 라 고 불 린 다.
우 리 는 먼저 그의 구조 방법 과 사용 방식 을 살 펴 보 자.
구조 함수:
    CyclicBarrier(int parties)//그 매개 변 수 는 장벽 이 차단 하 는 스 레 드 수량 을 나타 내 고 모든 스 레 드 는 await 방법 으로 알려 줍 니 다.
                                 Cyclic Barrier 에 대해 서 는 장벽 에 도 착 했 고 현재 스 레 드 가 막 혔 습 니 다.
    CyclicBarrier(int parties,Runnable barrier Action)//새로운 CyclicBarrier 를 만 듭 니 다.
                                주어진 수량의 참여 자(스 레 드)가 그것 을 기다 리 고 있 을 때,그것 은 스위치 를 뛰 어 넘 을 것 이다.
                                주어진 장애 동작(Runnable 매개 변수 제공)을 실행 하고 마지막 스 레 드 에서 장애 에 들 어 갑 니 다.
    방법:
    int await()   //모든 참여 자 들 이 이 barrier 에서 await 방법 을 호출 하기 전에 기다 릴 것 입 니 다.
                  방법 은 기다 리 거나 지 정 된 대기 시간 을 초과 할 것 이다.
    int getNumberWaiting()  //현재 장벽 에서 기다 리 고 있 는 참여 자 수 를 되 돌려 줍 니 다.
    int getParties()        //이 barrier 를 시작 하 라 는 참여 자 수 를 되 돌려 줍 니 다.
    boolean isBroken()      //이 장벽 이 파손 상태 에 있 는 지 확인 합 니 다.
    void reset()            //장벽 을 초기 상태 로 초기 화 합 니 다.
다음은 작은 프로그램 을 살 펴 보고 Cyclic Barrier 의 사용 방식 을 알 아 보 겠 습 니 다.

public class CyclicBarrierTest {
  static CyclicBarrier c = new CyclicBarrier(2);
  public static void main(String[] args) {
    new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          c.await();
        } catch (Exception e) {

        }
        System.out.println(Thread.currentThread().getName()+"    ...");
      }
    }).start();

    try {
      c.await();
    } catch (Exception e) {

    }
    System.out.println(Thread.currentThread().getName()+"    ...");
    System.out.println("   ,        "+c.getParties()+"       ");
  }
}
출력 결 과 는:
Thread-0 이 기다 리 고 있 습 니 다...
main 대기 중...
사람 이 충분 하 니 출발 합 시다.현재 두 사람 이 경기 에 참가 하고 있 습 니 다.
Process finished with exit code 0
위 프로그램 에서"static CyclicBarrier c=new CyclicBarrier(2);"매개 변수 2 가 3 으로 바 뀌 면 프로그램의 스 레 드 Thread-0 과 main 은 계속 기 다 립 니 다.Cyclic Barrier 는 한 스 레 드 를 하나의 장벽(동기 점 이 라 고도 부 를 수 있 음)에 도달 하 게 할 때 막 히 고 마지막 스 레 드 가 장벽 에 도착 할 때 까지 장벽 이 열 리 지 않 기 때문에 마지막 스 레 드 가 늦 어 지지 않 기 때문에 장벽 도 열 리 지 않 습 니 다.
Cyclicbarrier 는 더 높 은 구조 함수 Cyclicbarrier(int parties,Runnable barrierAction)를 제공 하여 스 레 드 가 장벽 에 도 착 했 을 때 barrierAction 을 우선 실행 하여 더욱 복잡 한 업무 장면 을 처리 하 는 데 편리 합 니 다.예 시 를 살 펴 보 자.

public class CyclicBarrierTest {
  static CyclicBarrier c = new CyclicBarrier(2,new PrioExecut());
  public static void main(String[] args) {
    new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          c.await();
        } catch (Exception e) {

        }
        System.out.println(Thread.currentThread().getName()+"    ...");
      }
    }).start();

    try {
      c.await();
    } catch (Exception e) {

    }
    System.out.println(Thread.currentThread().getName()+"    ...");
    System.out.println("   ,        "+c.getParties()+"       ");
  }
}

class PrioExecut implements Runnable{
  @Override
  public void run() {
    System.out.println("    5 ,      !");
  }
}
실행 결 과 는:
나 는 먼저 5 초 를 뛸 것 이다.네가 믿 든 안 믿 든!
Thread-0 이 기다 리 고 있 습 니 다...
main 대기 중...
사람 이 충분 하 니 출발 합 시다.현재 두 사람 이 경기 에 참가 하고 있 습 니 다.
Process finished with exit code 0
구조 방법의 매개 변 수 를 볼 수 있 습 니 다.new PrioExecut()의 스 레 드 가 우선 실 행 됩 니 다.
2.CyclicBarrier 의 응용 장면
Cyclic Barrier 는 다 중 스 레 드 로 데 이 터 를 계산 하고 마지막 으로 결 과 를 계산 하 는 응용 장면 을 통합 할 수 있 습 니 다.예 를 들 어 지불 업무 에서 우 리 는 사전에 구 분 된 구역 의 형식 에 따라 일수 지 의 흐름 을 통계 한 다음 에 구역 의 계산 결과 에 따라 Runnable barrierAction 을 사용 하여 집계 하 는 것 이 좋 은 실현 이다.
3.Cyclic Barrier 와 Count Downlatch 의 차이
javadoc 에서 의 설명 은 다음 과 같 습 니 다:
CountDownLatch: A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.
CyclicBarrier : A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point.
  • 제 이해 에 따 르 면 Count Downlatch 에 있어 서 중점 은 그'하나의 스 레 드'입 니 다.다른 스 레 드 가 실 행 될 때 까지 기 다 려 야 실 행 될 수 있 습 니 다.그리고 그 N 의 스 레 드 는'어떤 일'을 끝 낸 후에 계속 기다 릴 수 있 고 종 료 될 수 있 습 니 다.예 를 들 어 앞에서 말 한 달리기 의 예 는 다섯 명의 주자 가 동시에 준 비 를 해 야 심판 이 달리 기 를 시작 하 라 고 명령 을 내 릴 수 있다.Cyclic Barrier 는 n 개의 스 레 드 를 강조 합 니 다.모두 가 서 로 를 기다 리 고 있 습 니 다.하나 가 완성 되 지 않 으 면 모두 가 기 다 려 야 합 니 다.
  • Countdown Latch 의 계수 기 를 리 셋 할 수 없습니다.Cyclic Barrier 의 계산 기 는 reset()방법 으로 초기 화 할 수 있 습 니 다.그래서 Cyclic Barrier 는 계산 에 오류 가 발생 하면 계산 기 를 리 셋 하고 스 레 드 를 다시 실행 할 수 있 는 더욱 복잡 한 업무 장면 을 처리 할 수 있 습 니 다.
  • 이상 은 자바 병행 프로 그래 밍 주제(9)-(JUC)CyclicBarrier 의 상세 한 내용 을 분석 하고 자바 jc CyclicBarrier 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 세 요!

    좋은 웹페이지 즐겨찾기