자바 기본 튜 토리 얼 join 방법 자바 다 중 스 레 드 튜 토리 얼 상세 설명
1.join()은 join()을 Thread.java 에 정의 합 니 다.join()의 역할:"메 인 스 레 드"가"하위 스 레 드"가 끝 난 후에 야 계속 실행 할 수 있 습 니 다.이 말 은 좀 어 려 울 수 있 으 니 우 리 는 예 를 들 어 이해 해 야 한다.
//
public class Father extends Thread {
public void run() {
Son s = new Son();
s.start();
s.join();
...
}
}
//
public class Son extends Thread {
public void run() {
...
}
}
설명:위의 두 가지 유형 은 Father(메 인 라인 클래스)와 Son(서브 스 레 드 클래스)이다.Son 은 Father 에서 만 들 고 작 동 하기 때문에 Father 는 메 인 라인 클래스 이 고 Son 은 하위 스 레 드 클래스 입 니 다.Father 메 인 스 레 드 에서 new Son()을 통 해'하위 스 레 드 s'를 새로 만 듭 니 다.이 어 s.start()를 통 해'하위 스 레 드 s'를 시작 하고 s.join()을 호출 합 니 다.s.join()을 호출 한 후에 Father 메 인 라인 은'하위 스 레 드 s'가 실 행 될 때 까지 기 다 립 니 다.'하위 스 레 드 s'가 실 행 된 후에 야 Father 메 인 스 레 드 가 계속 실 행 될 수 있 습 니 다.이것 이 바로 우리 가 말 하 는'join()의 역할 은 메 인 라인 이 하위 스 레 드 가 끝 난 후에 야 계속 운행 할 수 있 도록 하 는 것'입 니 다!2.join()소스 코드 분석(JDK 1.7.0 기반40)
public final void join() throws InterruptedException {
join(0);
}
public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (millis == 0) {
while (isAlive()) {
wait(0);
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
설명:코드 에서 우 리 는 발견 할 수 있다.millis==0 일 때 while(isAlive()순환 에 들 어 갑 니 다.즉,하위 스 레 드 가 살 아 있 는 한 주 스 레 드 는 끊임없이 기다 리 는 것 이다.우 리 는 위 에서 join()역할 을 설명 할 때의 코드 에 따라 join()의 용법 을 이해 합 니 다!문제:s.join()이 호출 된 곳 은'Father 메 인 스 레 드'에서 발생 했 지만 s.join()은'하위 스 레 드 s'를 통 해 호출 된 join()입 니 다.그렇다면 join()방법 중의 isAlive()는'하위 스 레 드 s'가 Alive 상태 인지 아 닌 지 를 판단 해 야 한다.대응 하 는 wait(0)도'하위 스 레 드 s'를 기 다 려 야 합 니 다.그러나 그렇다면 s.join()의 역할 은 어떻게'주 스 레 드 를 기다 리 게 하고 하위 스 레 드 가 완 료 될 때 까지'일 수 있 습 니까?'하위 스 레 드 를 기다 리 게 해 야 합 니까?'정 답:wait()의 역할 은'현재 스 레 드'를 기다 리 게 하 는 것 입 니 다.여기 있 는'현재 스 레 드'는 현재 CPU 에서 실행 중인 스 레 드 를 말 합 니 다.따라서 하위 스 레 드 를 호출 하 는 wait()방법 이지 만'메 인 스 레 드'를 통 해 호출 됩 니 다.그래서 휴면 하 는 것 은 메 인 스 레 드 이지'하위 스 레 드'가 아 닙 니 다!3.join()예 시 는 join()의 역할 을 이해 한 다음 에 예 시 를 통 해 join()의 용법 을 살 펴 본다.
// JoinTest.java
public class JoinTest{
public static void main(String[] args){
try {
ThreadA t1 = new ThreadA("t1"); // “ t1”
t1.start(); // “ t1”
t1.join(); // “ t1” “ main” , “ main() ”
System.out.printf("%s finish
", Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
static class ThreadA extends Thread{
public ThreadA(String name){
super(name);
}
public void run(){
System.out.printf("%s start
", this.getName());
//
for(int i=0; i <1000000; i++)
;
System.out.printf("%s finish
", this.getName());
}
}
}
실행 결과:
t1 start
t1 finish
main finish
결과 설명:실행 프로 세 스 는 그림(01)과 같이"메 인 스 레 드 main"에서 new ThreadA("t1")를 통 해"스 레 드 t1"을 새로 만 듭 니 다.이 어 t1.start()를 통 해'스 레 드 t1'을 시작 하고 t1.join()을 실행 합 니 다.(02)t1.join()을 실행 하면'메 인 스 레 드 main'은'차단 상태'에 들 어가 t1 실행 이 끝 날 때 까지 기 다 립 니 다.'하위 스 레 드 t1 이 끝나 면'주 스 레 드 main'을 깨 우 고'주 스 레 드'는 cpu 실행 권 을 다시 가 져 와 계속 실 행 됩 니 다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 기본 튜 토리 얼 의 자바 스 레 드 대기 및 자바 깨 우기 스 레 드 자바 다 중 스 레 드 튜 토리 얼다른 스 레 드 가 notify()나 notify All()을 호출 하여 이 스 레 드 를 깨 울 때 까지'현재 스 레 드'를 기다 리 게 합 니 다.다시 말 하면 이 방법 은 wait(0)의 효과 와 같다!덧 붙 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.