이 장의 내용은 다음과 같습니다.
1. join () 소개
2. join () 소스 코드 분석 (JDK1.7.0_40 기반)
3. join () 예제
1. join () 소개
join ()은 thread.java에 정의됩니다.
join ()의 역할 : "메인 스레드"가 계속 실행되기 전에 "자식 스레드"가 끝날 때까지 기다리십시오. 이 문장은 약간 모호 할 수 있지만 예를 통해 이해해야합니다.
코드 사본은 다음과 같습니다.
// 메인 스레드
공공 계급 아버지는 스레드 확장 {
public void run () {
아들 S = 새로운 아들 ();
s.start ();
s.join ();
...
}
}
// 어린이 실
공개 계급 아들은 스레드를 확장합니다 {
public void run () {
...
}
}
설명 :
위는 아버지 (메인 스레드 클래스)와 아들 (하위 스레드 클래스)입니다. 아들이 아버지에서 만들어지고 시작 되었기 때문에 아버지는 주요 스레드 수업이고 아들은 아이 스레드 수업입니다.
아버지 메인 스레드에서는 새로운 아들 ()을 통해 새로운 "자식 스레드"를 만듭니다. 그런 다음 s.start ()를 통해 "childsh 2"를 시작하고 s.join ()을 호출하십시오. S.Join ()을 호출 한 후, 아버지 메인 스레드는 "자식 스레드"가 완료되면 기다립니다. 이것이 우리가 "join ()의 역할은 메인 스레드가 자식 스레드가 계속 실행되기 전에 종료 될 때까지 기다리는 것입니다"라고 부릅니다!
2. join () 소스 코드 분석 (JDK1.7.0_40 기반)
코드 사본은 다음과 같습니다.
Public Final void join ()가 중단 된 exception {
가입 (0);
}
공개 최종 동기화 된 void 조인 (Long Millis)
방해받은 외수 {{
Long Base = System.CurrentTimeMillis ();
지금은 지금 = 0;
if (millis <0) {
새로운 불법 행정 exception을 던지십시오 ( "타임 아웃 값은 음수");
}
if (millis == 0) {
while (isAlive()) {
wait(0);
}
} 또 다른 {
while (isalive ()) {
긴 지연 = millis- 지금;
if (지연 <= 0) {
부서지다;
}
대기 (지연);
now = system.currenttimeMillis () -베이스;
}
}
}
설명 :
코드에서 우리는 그것을 찾을 수 있습니다. millis == 0이면 while (isalive ()) 루프, 즉 자식 스레드가 살아있는 한 메인 스레드가 지속적으로 기다립니다.
우리는 join ()의 역할을 설명 할 때 위 코드를 기반으로 join ()의 사용법을 이해합니다!
질문:
s.join ()이라고 불리는 장소는 "아버지 메인 스레드"에서 발생하지만 S.join ()는 "child 스레드 S"를 통해 join ()이라고합니다. 그런 다음 join () 메소드의 isalive ()는 "자식 스레드"가 살아있는 상태인지 여부를 결정해야합니다. 그러나 이것이 사실이라면, s.join ()의 기능이 어떻게 "자식 스레드가 완료 될 때까지 메인 스레드가 기다릴 수있게 할 수 있습니까?" 객체는 잘 불립니다) "?
답변 : Wait ()의 기능은 "현재 스레드"를 기다리는 것입니다. 여기에서 "현재 스레드"는 현재 CPU에서 실행되는 스레드를 나타냅니다. 따라서 자식 스레드의 대기 방법이 호출되지만 "메인 스레드"를 통해 호출됩니다.
3. join () 예제
join ()의 역할을 이해 한 후에는 예제를 통해 join ()의 사용법을 확인해 봅시다.
코드 사본은 다음과 같습니다.
// contredest.java 소스 코드
공공 수업 공동 {
public static void main (String [] args) {
노력하다 {
Threada T1 = New Threada ( "T1"); // 새 "스레드 T1"
t1.start (); // 시작 "스레드 t1"
t1.join (); // "Main Thread Main"에 "스레드 T1"을 추가하고 "Main Thread Main ()이 완료되기를 기다립니다.
System.out.printf ( "%s finish/n", thread.currentthread (). getName ());
} catch (InterruptedException e) {
e.printstacktrace ();
}
}
정적 클래스 스레드는 스레드를 확장합니다.
public threada (문자열 이름) {
슈퍼 (이름);
}
public void run () {
System.out.printf ( "%s start/n", this.getName ());
// 작동 지연
for (int i = 0; i <1000000; i ++)
;
System.out.printf ( "%s finish/n", this.getName ());
}
}
}
실행 결과 :
코드 사본은 다음과 같습니다.
T1 시작
T1 마감
메인 마감
결과 설명 :
작동 프로세스는 그림에 표시됩니다
(01) New Threada ( "T1")를 통해 "Main Thread Main"에서 새로운 "스레드 T1"을 만듭니다. 다음으로 t1.start ()를 통해 "스레드 t1"을 시작하고 t1.join ()을 실행하십시오.
(02) t1.join ()을 실행 한 후 "메인 스레드 메인"은 "차단 상태"에 들어가서 T1의 실행이 끝날 때까지 기다립니다. "Child Thread T1"이 완료되면 "메인 스레드 메인"이 깨어나고 "메인 스레드"는 CPU 실행 권한을 되찾고 계속 실행됩니다.