머리말:
지난 주 테스트는 개발 동료들이 개발 한 모듈에 버그를 제기했으며 여전히 우연의 일치였습니다.
코드를주의 깊게 확인한 후 비즈니스에서 멀티 스레딩이 활성화되고 동시에 2 개의 스레드가 실행되는 것을 발견했지만 새로 시작된 두 스레드는 하나가 완료되고 다른 스레드는 버그를 제거하기 위해 계속 실행되도록해야합니다.
언제 사용해야합니까?
멀티 스레딩은 여러 곳에서 사용되지만 특정 스레드가 완료된 후 다른 스레드를 시작하려면 CountdownLatch가 유용 할 수 있습니다.
그것을 사용하는 방법?
일반적인 멀티 스레드 코드를 살펴 보겠습니다.
패키지 코드; public class mythread는 스레드 {public static void main (String [] args) {mythread th = new Mythread (); 스레드 t1 = 새 스레드 (th, "mythread"); t1.start (); system.out.println (thread.currentthread (). getName ()); } public void run () {mythread1 th2 = new Mythread1 (); 스레드 t2 = 새 스레드 (Th2, "mythread1"); t2.start (); System.out.println (this.currentThread (). getName ()); } class mythread1은 스레드 {public void run () {try {thread.sleep (1000); } catch (InterruptedException e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } system.out.println (this.currentThread (). getName ()); }}}코드는 위와 같습니다. 먼저, Mythread를 사용하여 스레드 클래스를 물려받은 다음 Mythread 클래스 내에 다른 Mythread1 클래스를 작성하여 스레드 클래스를 상속하고 실행 방법에서 1 초 동안 잠을 자도록합니다. 이러한 방식으로 코드는 인쇄됩니다.
위의 출력 순서에서 메인 스레드가 처음 시작된 다음 신화 스레드가 시작되었음을 알 수 있습니다. 신화 스레드에서 Mythread1 스레드가 시작됩니다. 그러나 Mythread1 스레드가 1 초 동안 잠을 자고 있었기 때문에 후속 비즈니스의 처리를 시뮬레이션 했으므로 Mythread가 완료된 것보다 조금 늦어졌습니다.
이제 CountdownLatch를 코드에 추가하고 Mythread1을 먼저 실행 한 다음 Mythread가 계속 실행하도록하십시오.
패키지 코드; import java.util.concurrent.countdownlatch; public class mythread extends 스레드 {countdownlatch countdownlatch = new CountdownLatch (1); public static void main (String [] args) {mythread th = new Mythread (); 스레드 t1 = 새 스레드 (th, "mythread"); t1.start (); system.out.println (thread.currentthread (). getName ()); } public void run () {mythread1 th2 = new Mythread1 (); 스레드 t2 = 새 스레드 (Th2, "mythread1"); t2.start (); {countdownlatch.await (); } catch (InterruptedException e) {e.printstacktrace (); } system.out.println (this.currentThread (). getName ()); } class mythread1은 스레드 {public void run () {try {thread.sleep (1000); } catch (InterruptedException e) {e.printstacktrace (); } system.out.println (this.currentThread (). getName ()); countdownlatch.countdown (); }}}코드 쓰기 방법은 위에 나와 있으며 대략 세 단계로 나뉩니다.
1. 첫 번째 새 CountdownLatch 객체 매개 변수 1로 설정하자 (개인적으로 이것은 새로운 배열과 같다는 것을 이해합니다. 배열이 지워지면 인터럽트 된 스레드가 계속 실행될 수 있습니다).
2. Mythread 클래스에서 countdownlatch.await ()를 호출합니다. 현재 스레드 실행을 중지합니다.
3. Mythread1 클래스에서 countdownlatch.countdown () 메소드를 호출하십시오. 모든 mythread1이 실행되고 메소드가 마침내 호출되면이 기능은 내가 언급 한 "배열"을 지우는 것입니다.
출력의 인쇄 결과를 확인하십시오
결과는 위의 그림과 같이 예상 결과와 일치합니다.
마지막으로 CountdownLatch CountdownLatch = New CountdownLatch (1)에 대해 이야기 해 봅시다. 이 영역에서 1을 설정하려면 1을 빼기 위해 CountdownLatch.countdown ()을 한 번 호출해야합니다.
다른 숫자 인 경우 해당 횟수를 호출해야합니다. 그렇지 않으면 CountdownLatch.await ()을 호출하는 스레드가 실행되지 않습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.