CountdownLatch 지침은 참조 용입니다. 특정 내용은 다음과 같습니다
CountdownLatch는 java.util.concurrent 패키지로 다음 동기화 도구 클래스로 하나 이상의 스레드가 다른 스레드에서 작업 세트가 완료 될 때까지 기다릴 수 있습니다.
CountdownLatch의 사용은 매우 간단합니다. 다음 예는 온라인에서 본 것도 매우 적절합니다. 여기에 게시하겠습니다.
공개 클래스 테스트 {public static void main (String [] args) {countdownLatch 시작 = new CountdownLatch (1); CountdownLatch End = New CountdownLatch (2); for (int i = 0; i <2; i ++) {스레드 스레드 = 새 스레드 (새 플레이어 (시작, 끝)); thread.start (); } try {System.out.println ( "레이스 시작"); begin.countdown (); end.await (); System.out.println ( "레이스 엔드"); } catch (예외 e) {e.printstacktrace (); }}}/*** 플레이어*/클래스 플레이어는 런닝 가능한 {private countdownlatch 시작; 개인 CountdownLatch 끝; 플레이어 (CountdownLatch 시작, CountdownLatch End) {this.begin = 시작; this.end = 끝; } public void run () {try {begin.await (); System.out.println (Thread.currentThread (). getName () + "도착!") ;; end.countdown (); } catch (InterruptedException e) {e.printstacktrace (); }}}다음은 실행 결과입니다
CountdownLatch를 사용하여 실행 순서를 제어하는 것을 볼 수 있습니다.
위 코드에서는 Await () 메소드와 Countdown () 메소드를 사용합니다. 해당 기능을 확인해 봅시다.
먼저 Await () 메소드를 확인하십시오. 메인 메소드에서 end.await ()를 주석하십시오. 다음은 댓글을 달린 후 실행 결과입니다.
당신은 주 스레드가 참가자를 대표하는 스레드가 끝날 때까지 기다리지 않았다는 것을 알 수 있으며, 대회가 끝났다고 직접 발표했습니다! 처음에 끝난 게임 ---
여기서 Await () 메소드가 차단 효과가 있음 을 알 수 있습니다.
둘째, 카운트 다운 방법을 확인하고 참가자의 스레드에서 End.countdown ()에 댓글을 달아 드리겠습니다. 다음은 실행 결과입니다.
이 프로그램이 실행 중이며 모든 플레이어가 결승선에 도달했지만 심판은 게임의 끝을 홍보하지 않습니다. 그는 무엇을 기다리고 있습니까?
Countdown () 메소드는 차단 스레드를 깨우는 효과가 있다고 생각합니다.
그런 다음 차단 스레드를 깨우는 기능이 있으므로 Countdown () 메소드를 한 번만 호출하면 차단 된 메인 스레드를 깨울 수 없습니까?
시도해 봅시다.
Class Player2는 실행 가능한 {private countdownlatch 시작; 개인 CountdownLatch 끝; player2 (CountdownLatch 시작, CountdownLatch End) {this.begin = 시작; this.end = 끝; } public void run () {try {begin.await (); System.out.println (thread.currentthread (). getName () + "도착!"); // end.countdown (); } catch (InterruptedException e) {e.printstacktrace (); }}}주요 방법은 다음과 같이 수정되어 두 명의 다른 플레이어가 생성됩니다.
public static void main (String [] args) {CountdownLatch 시작 = New CountdownLatch (1); CountdownLatch End = New CountdownLatch (2); 스레드 스레드 = 새 스레드 (새 플레이어 (시작, 끝)); thread.start (); 스레드 스레드 2 = 새 스레드 (new player2 (시작, 끝)); Thread2.start (); try {system.out.println ( "레이스 시작"); begin.countdown (); end.await (); System.out.println ( "레이스 엔드"); } catch (예외 e) {e.printstacktrace (); }}실행하십시오. 결과는 다음과 같습니다
주요 프로그램은 차단되었으며 깨어나지 않았습니다. 심판은 화장실을 잠시 동안 사용하고 있습니다!
Countdown ()이 스레드를 직접 깨우지 않는 것 같습니다. 카운터, 카운트 다운과 비슷합니다.
API 문서를 확인하십시오. 충분히, 우리는 Parameter 2를 생성자에 추가했으며, end.await ()의 차단 된 스레드를 깨우려면 countdown ()를 2 번 호출해야합니다.
CountdownLatch End = New CountdownLatch (2);
요약하기 위해
1. CountdownLatch End = New CountdownLatch (N); // 객체를 구성 할 때는 매개 변수 N을 전달해야합니다.
2. end.await ()는 end.countdown () 메소드가 스레드가 해제되기 전에 N 회라고 할 때까지 스레드를 차단할 수 있습니다.
3. end.countdown ()을 여러 스레드에서 호출하여 모든 스레드의 합인 호출 수를 계산할 수 있습니다.
다음 블로그에서는 CountdownLatch가 소스 코드 수준에서 어떻게 작동하는지 설명하겠습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.