CountDownlatch 동기 화 도구 클래스 사용 설명
4856 단어 CountDownLatch동기 화 도구 클래스
Countdown Latch 는 자바.util.concurrent 패키지 의 다음 동기 화 도구 클래스 입 니 다.다른 스 레 드 에서 한 그룹 이 실 행 될 때 까지 한 개 이상 의 스 레 드 를 기다 릴 수 있 습 니 다.
Countdown Latch 의 용법 은 매우 간단 합 니 다.아래 의 예 도 제 가 인터넷 에서 본 것 입 니 다.매우 적절 합 니 다.여기에 붙 여 주세요.
public class Test {
public static void main(String[] args) {
CountDownLatch begin = new CountDownLatch(1);
CountDownLatch end = new CountDownLatch(2);
for(int i=0; i<2; i++){
Thread thread = new Thread(new Player(begin,end));
thread.start();
}
try{
System.out.println("the race begin");
begin.countDown();
end.await();
System.out.println("the race end");
}catch(Exception e){
e.printStackTrace();
}
}
}
/**
*
*/
class Player implements Runnable{
private CountDownLatch begin;
private CountDownLatch end;
Player(CountDownLatch begin,CountDownLatch end){
this.begin = begin;
this.end = end;
}
public void run() {
try {
begin.await();
System.out.println(Thread.currentThread().getName() + " arrived !");;
end.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
다음은 실행 결과 입 니 다.Count Downlatch 를 통 해 스 레 드 의 실행 순 서 를 제어 하 는 것 을 볼 수 있 습 니 다.
위의 코드 에서 우 리 는 await()방법 과 countDown()방법 을 사용 합 니 다.우 리 는 그것들 각자 의 작용 을 검증 해 보 자.
우선 await()방법 을 검증 합 니 다.main 방법 중의 end.awat()주석 을 지 웁 니 다.다음은 주석 이 떨 어 진 후의 실행 결과 입 니 다.
메 인 스 레 드 가 대표 선수 의 스 레 드 가 끝나 기 를 기다 리 지 않 고 경기 가 끝났다 고 발표 하 는 것 을 볼 수 있 습 니 다!처음부터 끝 난 경기-
여기 서 알 수 있 듯 이 await()방법 은 차단 작용 을 한다.
그 다음 에 countDown 방법 을 검증 하고 선수 라인 을 대표 하 는 end.countDown()을 주석 합 니 다.다음은 실행 결과 입 니 다.
프로그램 이 계속 운영 되 고 있 고 모든 선수 가 결승점 에 도 착 했 지만 심판 은 경기 가 끝 났 음 을 알 리 지 않 고 무엇 을 기다 리 고 있 을 까?
우 리 는 countDown()방법 이 차단 라인 을 깨 우 는 작용 을 할 것 이 라 고 추측한다.
차단 스 레 드 를 깨 우 는 역할 을 하 는 이상 한 번 만 countDown()방법 을 사용 하면 차단 되 는 메 인 스 레 드 를 깨 울 수 있 지 않 습 니까?
위 에 있 는 cout Down()의 설명 을 취소 하고 선 수 를 다시 만 듭 니 다.코드 는 다음 과 같 습 니 다.
class Player2 implements Runnable{
private CountDownLatch begin;
private CountDownLatch end;
Player2(CountDownLatch begin,CountDownLatch end){
this.begin = begin;
this.end = end;
}
public void run() {
try {
begin.await();
System.out.println(Thread.currentThread().getName() + " arrived !");
// end.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
main 방법 도 다음 과 같이 수정 하여 서로 다른 선 수 를 만 들 었 습 니 다.
public static void main(String[] args)
{
CountDownLatch begin = new CountDownLatch(1);
CountDownLatch end = new CountDownLatch(2);
Thread thread = new Thread(new Player(begin, end));
thread.start();
Thread thread2 = new Thread(new Player2(begin, end));
thread2.start();
try
{
System.out.println("the race begin");
begin.countDown();
end.await();
System.out.println("the race end");
}
catch (Exception e)
{
e.printStackTrace();
}
}
실행 해 보 세 요.다음은 결과 입 니 다.메 인 프로그램 이 계속 막 혀 서 깨 어 나 지 않 았 습 니 다.심판 은 화장실 에 오래 갔 습 니 다!
그 러 고 보 니 countDown()은 스 레 드 를 직접 깨 우 는 것 이 아니 라 카운터,카운트다운 같은 것 입 니 다.
API 문 서 를 보십시오.과연 구조 함수 에 인자 2 를 추 가 했 습 니 다.countDown()을 2 번 호출 해 야 합 니 다. end.awat()가 막 힌 스 레 드 를 깨 울 수 있 습 니 다.
CountDownLatch end = new CountDownLatch(2);
총괄 해 보면,1、CountDownLatch end = new CountDownLatch(N); //대상 을 구성 할 때 인자 N 을 입력 해 야 합 니 다.
2、end.await() N 회 end.countDown()방법 을 호출 할 때 까지 스 레 드 를 막 을 수 있 습 니 다.
3.end.countDown()은 여러 스 레 드 에서 호출 할 수 있 습 니 다. 호출 횟수 를 계산 하 는 것 은 모든 스 레 드 호출 횟수 의 총화 이다.
다음 블 로 그 는 Count Downlatch 의 작업 원 리 를 소스 차원 에서 설명 할 것 이다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java에서 CountDownLatch 사용법 해석CountDownLatch 클래스는 동기식 카운터로 구성할 때 int 파라미터를 전송합니다. 이 파라미터는 카운터의 초기 값입니다. countDown () 방법을 호출할 때마다 카운터가 1을 줄이고 카운터가 0보다 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.