자물쇠는 문과 같습니다. 자물쇠가 끝 상태에 도달하기 전에 문은 항상 닫혀 있고 어떤 스레드도 통과할 수 없습니다. 끝 상태에 도달하면 문이 열리고 모든 스레드가 통과할 수 있습니다. 하나 이상의 스레드가 일련의 이벤트가 발생할 때까지 기다리게 할 수 있습니다. 래칭 상태는 대기할 이벤트 수를 나타내는 정식 양수로 초기화된 카운터로 구성됩니다. countDown 메소드는 카운터를 감소시켜 이벤트가 발생했음을 나타내며, Wait 메소드는 카운터가 0에 도달하여 대기된 이벤트가 발생했음을 나타냅니다. CountDownLatch는 하나의 스레드(또는 여러 스레드)가 실행을 계속하기 전에 다른 n 스레드가 무언가를 완료할 때까지 기다려야 함을 강조합니다.
시나리오 적용:
10명의 선수가 주심의 명령을 기다리며 동시에 달리기 시작하며 마지막 사람이 결승선을 통과하면 경기가 종료됩니다. 10개의 움직임은 10개의 스레드와 동일합니다. 여기서 핵심은 10개의 스레드가 동시에 실행되도록 제어하는 것과 마지막 스레드가 끝점에 도달한 시기를 결정하는 방법입니다. 두 개의 잠금 장치를 사용할 수 있으며, 첫 번째 잠금 장치는 심판의 명령을 기다리는 스레드 10개를 제어하는 데 사용되며, 두 번째 잠금 장치는 게임 종료를 제어하는 데 사용됩니다.
import java.util.concurrent.CountDownLatch; 클래스 Aworker는 Runnable을 구현합니다. private CountDownLatch end; public Aworker(int num, final CountDownLatch end) { this.num = num; = start; this.end = end; } @Override public void run() { // TODO 자동 생성된 메서드 스텁 try { System.out.println(num + "번째 사람이 준비되었습니다"); //Ready} catch (InterruptedException e) { e.printStackTrace() } finally { end.countDown(); 카운터가 1씩 감소하고 끝점에 도달합니다. System.out.println(num + "th peoplearrival"); } }} public class Race { public static void main(String[] args) { int num = 10; CountDownLatch start = new CountDownLatch(1); CountDownLatch end = new CountDownLatch(num); for (int i = 1; i <= num; i++) { new Thread(new Aworker(i, start, end)).start() ; } try { Thread.sleep((long) (Math.random() * 5000)) } catch (InterruptedException e1) { // TODO 자동 생성된 캐치 블록 e1.printStackTrace(); } System.out.println("judge say: run!"); //심판이 명령을 내린 후 실행 시작 long startTime = System.nanoTime( ); try { end.await(); //종료 대기} catch (InterruptedException e) { // TODO 자동 생성된 catch 블록 e.printStackTrace() } finally { long endTime = System.nanoTime(); System.out.println("판사님 말씀: 모두 도착했습니다!"); System.out.println("사용 시간: " + (endTime - startTime)) } }}
산출
1번째 사람이 준비되었습니다2번째 사람이 준비되었습니다4번째 사람이 준비되었습니다6번째 사람이 준비되었습니다3번째 사람이 준비되었습니다10번째 사람이 준비되었습니다8번째 사람이 준비되었습니다5번째 사람이 준비되었습니다7번째 사람이 준비되었습니다9번째 사람이 준비되었습니다judge say : 달려라!1번째 사람 도착4번째 사람 도착10번째 사람 도착5번째 사람 도착2번째 사람 도착 판단 : 모두 도착했다 !9번째 사람 도착7번째 사람 도착8번째 사람 도착3번째 사람 도착6번째 사람 도착연기 시간: 970933