자바 다 중 스 레 드 빨리 해결 해 줄 게(5)

1.소개
Countdown Lantch 카운트다운,동기 화 보조 클래스,하나의 스 레 드(또는 여러 개),다른 N 개의 스 레 드 가 어떤 일 을 완성 한 후에 야 실행 할 수 있 습 니 다.주어진 개수 로 Countdown Latch 를 초기 화 합 니 다.실 행 된 스 레 드 개 수 를 기다 리 겠 다 는 뜻 입 니 다.
Countdown()을 호출 할 때마다 1 을 줄 이 고 await()함수 가 0 이 될 때 까지 기다 리 는 스 레 드 의 실행 을 막 습 니 다.
CountDownlatch 리 셋 불가
2.countdownlantch 의 용법.
예 를 들다
장면:10 인 달리기 시 뮬 레이 션."Game Start"를 외치 고 나 서 야 뛰 기 시 작 했 습 니 다.10 명 이 뛰 고 나 서 야"Game Over."라 고 외 쳤 습 니 다.코드 는 다음 과 같 습 니 다.

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* CountDownLatchTest
* @author   
*/
public class CountDownLatchTest {
   private static final int RUNNER_COUNT = 10;
   private static final int CORE_THREAD_COUNT = 10;
   public static void main(String[] args) throws InterruptedException {
       final CountDownLatch begin = new CountDownLatch(1);
       final CountDownLatch end = new CountDownLatch(RUNNER_COUNT);
       final ExecutorService exec = Executors.newFixedThreadPool(CORE_THREAD_COUNT);
       //       
       for (int i = 0; i < RUNNER_COUNT; i++) {
           final int NO = i + 1;
           Runnable run = () -> {
               try {
                   //     begin              
                   begin.await();
                   Thread.sleep((long)(Math.random() * 10000));
                   System.out.println("No." + NO + " arrived");
              } catch (InterruptedException e) {
                   e.printStackTrace();
              } finally {
                   //       
                   end.countDown();
              }
          };
           exec.submit(run);
      }
       System.out.println("Game Start ...");
       begin.countDown();
       //          
       end.await();
       System.out.println("Game Over.");
       exec.shutdown();
  }
}
图片
3.AQS 를 어떻게 이용 하여 CountDownlatch 를 실현 합 니까?
图片
  • void await():현재 count 가 0 보다 크 면 현재 스 레 드 는 count 가 0 이나 중 단 될 때 까지 기 다 립 니 다
  • boolean await(long timeout,TimeUnit unit):현재 스 레 드 를 잠 금 장치 가 0 으로 되 돌리 기 전에 기 다 립 니 다.스 레 드 가 중단 되 거나 지정 한 대기 시간 을 초과 하지 않 는 한
  • void countDown():잠 금 장치 의 수 를 점차 줄 이 고 0 에 도달 하면 기다 리 는 모든 스 레 드 를 방출 합 니 다.long getCount():계수 획득 수량
  • 코드 를 통 해 알 수 있 듯 이 Countdown Latch 의 핵심 실현 은 내부 클래스 Sync 이 고 Sync 는 Abstract Queued Synchronizer 에서 계승 하여 Sync 를 열 어 보 겠 습 니 다.
    
    private static final class Sync extends AbstractQueuedSynchronizer {
          private static final long serialVersionUID = 4982264981922014374L;
          Sync(int count) {
              setState(count);
          }
          int getCount() {
              return getState();
          }
          protected int tryAcquireShared(int acquires) {
              return (getState() == 0) ? 1 : -1;
          }
          protected boolean tryReleaseShared(int releases) {
              // Decrement count; signal when transition to zero
              for (;;) {
                  int c = getState();
                  if (c == 0)
                      return false;
                  int nextc = c-1;
                  if (compareAndSetState(c, nextc))
                      return nextc == 0;
              }
          }
      }
    전체 Sync 의 코드 구현 은 간단 합 니 다.
    4.567917.스 레 드 계 수 는 state 통 제 를 통 해 지난 글 에서 우리 가 분석 한 바 와 같이 state 의 동기 화 사용 CAS 가 실현 하 는 낙관적 인 자물쇠 이다
  • 잠 금 계 수 는 try Acquire Shared 를 통 해 코드 가 매우 직접적 입 니 다.state==0 이 1 로 돌아 가면 현재 스 레 드 를 대기 열 에 추가 합 니 다
  • 자 물 쇠 를 try Release Shared 를 통 해 state-1 을 자 물 쇠 를 풀 어 줍 니 다
  • 图片
    AQS 의 실현 은 다음 글 을 볼 수 있다.'다 중 스 레 드 시리즈 5>아무 도 말 하지 않 은 AQS,다 중 스 레 드 프로 그래 밍 을 연결 합 니 다.
    4.총화
    countdownlantch 의 단독 코드 를 분석 해 보면 AQS 를 통 해 이 루어 진 스 레 드 동기 화가 얼마나 간단 한 지 알 수 있 기 때문에 AQS 를 이해 하면 자신의 동기 화 기 를 실현 할 수 있 습 니 다.
    이 글 은 여기까지 입 니 다.당신 에 게 도움 이 되 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 기 를 바 랍 니 다!

    좋은 웹페이지 즐겨찾기