카운트 다운 (카운트 다운) 래치로 변환 할 수 있습니다. 말할 것도없이, 래치는 이름에서 알 수 있듯이 진행을 방지하는 것을 의미합니다. 여기에서는 CountdownLatch.await () 메소드가 카운트 다운이 0이되기 전에 현재 스레드를 차단한다는 것을 의미합니다.
CountdownLatch는 하나 이상의 스레드가 다른 스레드에서 수행 될 때까지 기다릴 수있는 동기식 도우미 클래스입니다.
CountdownLatch는 Thread.join () 메소드와 유사하게 작동하며 한 스레드 그룹과 다른 스레드 그룹 간의 협업에 사용할 수 있습니다. 예를 들어, 메인 스레드는 작업을 수행하기 전에 일련의 준비가 필요하며, 이러한 모든 준비가 완료된 경우에만 주 스레드가 작업을 계속할 수 있습니다. 이러한 준비는 서로 독립적이므로 속도를 높이기 위해 동시에 실행할 수 있습니다. 이 시나리오에서 CountdownLatch를 사용하여 스레드 간의 스케줄링을 조정할 수 있습니다. 스레드가 직접 생성 된 시대 (Java 5.0 이전), thread.join ()을 사용할 수 있습니다. JUC가 나타나면 스레드 풀의 스레드를 직접 참조 할 수 없으므로 CountdownLatch를 사용해야합니다.
CountdownLatch 클래스는 동기 카운터입니다. 구성 할 때 int 매개 변수가 전달됩니다. 이 매개 변수는 카운터의 초기 값입니다. Countdown () 메소드가 호출 될 때마다 카운터가 1으로 감소하고 카운터가 0보다 크면 Await () 메소드는 프로그램을 차단하고 계속 실행합니다. CountdownLatch는 카운트 다운 래치로 간주 될 수 있으며, 카운트가 0으로 줄어드면 특정 이벤트를 트리거합니다.이 기능을 사용하면 기본 스레드가 하위 스레드의 끝을 기다릴 수 있습니다. 다음은 모의 선수 경쟁의 예입니다.
CountdownLatch의 매우 일반적인 응용 프로그램 시나리오는 다음과 같습니다. 아래쪽으로 실행하려는 작업이 있지만, 아래로 계속 실행되기 전에 다른 작업이 실행될 때까지 기다려야합니다. 우리가 계속 실행하려는 작업이 CountdownLatch 객체의 Await () 메소드를 추가로 호출하고 다른 작업이 자신의 작업을 실행 한 후 동일한 CountdownLatch 객체에서 Countdown () 메소드를 호출하면 Await () 메서드를 호출하는 작업이 CountdownLatch 객체의 수 값이 0으로 줄어들 때까지 계속 차단하고 대기합니다.
CountdownLatch 함수 목록
CountdownLatch (int count)는 주어진 카운트로 초기화 된 CountdownLatch를 구성합니다. // 스레드가 중단되지 않는 한 래치가 0으로 계산 될 때까지 현재 스레드가 기다립니다. void await () // 스레드가 중단되거나 지정된 대기 시간이 초과되지 않는 한, 래치가 0으로 카운트 될 때까지 현재 스레드가 기다립니다. 부울이 기다리고 있습니다 (긴 타임 아웃, 시간 유닛) // 래치 카운트를 줄입니다. 카운트가 0에 도달하면 모든 대기 스레드가 해제됩니다. void countdown () // 현재 카운트를 반환합니다. long getCount () //이 래치와 그 상태를 식별하는 문자열을 반환합니다. 문자열 toString ()
CountdownLatch 데이터 구조
CountdownLatch의 UML 클래스 다이어그램은 다음과 같습니다.
CountdownLatch의 데이터 구조는 간단하며 "공유 잠금"을 통해 구현됩니다. 동기화 객체를 포함하고 동기화는 동기화 유형입니다. SYNC는 AQS에서 상속되는 인스턴스 클래스입니다.
CountdownLatch의 예
다음은 CountdownLatch를 통해 구현됩니다. "Main Thread"는 "5 Child Threads"가 계속 실행되기 전에 "지정된 작업 (1000ms)을 완료하기 위해 기다립니다.
import java.util.concurrent.countdownlatch; import java.util.concurrent.cyclicbarrier; public class countdownlatchtest1 {private static int latch_size = 5; Private Static CountdownLatch donesignal; public static void main (String [] args) {try {donesignal = new CountdownLatch (latch_size); // (int i = 0; i <latch_size; i ++) 새 innerthread (). start (); System.out.println ( "메인이 기다리고 시작."); // "Main Thread"는 Donesignal.await ()를 완료하기 위해 스레드 풀에서 5 개의 작업이 완료 될 때까지 기다립니다. System.out.println ( "메인이 기다리고있다"); } catch (InterruptedException e) {e.printstacktrace (); }} static class innerthread는 스레드 {public void run () {try {thread.sleep (1000); System.out.println (Thread.currentThread (). getName () + "Sleep 1000ms."); // countdownLatch의 값을 1 donesignal.countdown ()으로 빼냅니다. } catch (InterruptedException e) {e.printstacktrace (); }}}} 실행 결과 :
스레드 -0 수면 1000m. 제한 -2 수면 1000m. 스레드 -1 수면 1000ms.Thread-4 수면 1000ms.Thread-3 수면 1000m.
결과 설명 : 기본 스레드는 donesignal.await ()를 사용하여 다른 스레드가 0으로 감소 될 때까지 기다릴 때까지 기다립니다. 다른 5 개의 내부 스레드 스레드, 각 스레드는 donesignal.countdown ()을 통해 1 씩 1 씩 gonesignal 값을 빼냅니다. Donesignal이 0이면 Main은 깨어 난 후에도 계속 실행됩니다.
추신 : CountdownLatch와 Cyclicbarrier의 차이 :
(1) CountdownLatch의 기능은 1 또는 N 스레드가 다른 스레드가 실행을 완료 할 때까지 기다릴 수 있도록하는 것입니다. Cyclicbarrier는 N 스레드가 서로를 기다릴 수 있도록합니다.
(2) CountdownLatch의 카운터는 재설정 될 수 없습니다. 사이클리 배저의 카운터는 재설정 후 사용할 수 있으므로 루프 배리어라고합니다.