자바 기본 튜 토리 얼 join 방법 자바 다 중 스 레 드 튜 토리 얼 상세 설명

본 장 에서 언급 한 내용 은 1.join()소개 2.join()소스 코드 분석(JDK 1.7.0 기반40)3.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 실행 권 을 다시 가 져 와 계속 실 행 됩 니 다

좋은 웹페이지 즐겨찾기