자바 다 중 스 레 드 join()방법의 역할 과 실현 원리 분석(응용 장면)

1.join()방법의 역할
    이 방법 은 현재 스 레 드 를 먼저 걸 고 다른 스 레 드 가 끝 난 후에 현재 스 레 드 의 코드 를 실행 하 는 것 입 니 다.

2.응용 장면
예 를 들 어 세 사람 이 샤 오 홍,샤 오 리,샤 오 왕 이 있 는데 세 사람 이 같이 호텔 에 가서 밥 을 먹 기로 약속 했다.요 리 는 이미 주문 되 었 다. 세 사람 은 서로 다른 곳 에서 출발 하여 세 사람 이 모두 호텔 에 도착 한 후에 야 음식 을 내 놓 을 수 있다.그러면 이 세 사람 은 각각 세 개의 스 레 드 를 대표 합 니 다.이 세 개의 스 레 드 가 실 행 된 후에 야'요리 가 나 오 는'코드 논 리 를 실행 할 수 있 습 니 다.

코드 예제

package com.Lock;
 
/**
 * join    
 *         、  、  ,             ,      ,            ,                  ;               ,               “  ”      ,
 */
public class ConutDownLatchJoinDemo implements Runnable {
 
 
    @Override
    public void run() {
 
        System.out.println(Thread.currentThread().getName() + "     ");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "    ");
 
 
    }
}
 
//     
class Hotel2 implements  Runnable{
 
    Thread thread;
 
    public Hotel2 ( Thread thread){
        this.thread = thread;
    }
    @Override
    public void run() {
 
        System.out.println(Thread.currentThread().getName() +"         .....");
        try {
            //                   
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("   ,"+Thread.currentThread().getName() +"       ");
    }
}
class Main2 {
    public static void main(String[] args) throws InterruptedException {
 
        Thread t1 = new Thread(new ConutDownLatchJoinDemo(), "  ");
        Thread t2 = new Thread(new ConutDownLatchJoinDemo(), "  ");
        Thread t3 = new Thread(new ConutDownLatchJoinDemo(), "  ");
 
        //        
        t1.start();
        t2.start();
        t3.start();
 
        //                
        new Thread(new Hotel2(t3),"  ").start();
 
 
    }
}
결과 인쇄

3.구덩이
자바 의 join 방법 중,여기에 구덩이 가 하나 있 는데,바로 아래 의 이 방법 입 니 다.

Thread.currentThread().join();
join 방법의 역할 은 스 레 드 가 끝 날 때 까지 기다 리 는 것 임 을 잘 알 고 있 습 니 다.Thread.currentThread().join()을 호출 하면;이 방법 은 스 레 드 가 계속 막 혀 서 종료 할 수 없습니다.스스로 끝 날 때 까지 기다 리 고 있 기 때문이다.이것 은 의심 할 여지없이 자물쇠 가 될 것 이다.

다음은 코드 가 위의 것 과 마찬가지 로 코드 를 한 줄 만 바 꾸 면 됩 니 다.위의 코드 의 Hotel.run()방법 에서 t3.join()을 테스트 합 니 다.Thread.currentThread().join()으로 변경 하기;된다

//     
class Hotel2 implements  Runnable{
 
    Thread thread;
 
    public Hotel2 ( Thread thread){
        this.thread = thread;
    }
    @Override
    public void run() {
 
        System.out.println(Thread.currentThread().getName() +"         .....");
        try {
            //     t3.join();    Thread.currentThread().join();
            Thread.currentThread().join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("   ,"+Thread.currentThread().getName() +"       ");
    }
}
실행 후 결 과 는 다음 과 같 습 니 다.

그 러 니 이 방법 은 직접 사용 하지 마 세 요.
4.join 방법의 실현 원리
    이렇게 많은 말 을 했 고 이렇게 많은 예 를 들 었 습 니 다.join 방법 은 어떻게 스 레 드 기다 림 을 실현 합 니까?제 가 join 방법 내 부 를 누 르 면 볼 수 있 습 니 다.사실은 그 내 부 는 wait()방법 을 사용 한 것 입 니 다.

단지 한 걸음 더 했 을 뿐,하나의 순환 으로 라인 이 아직 살아 있 는 지 아 닌 지 를 판단 했다.isAlive()방법 은 라인 이 아직 살아 있 는 지 아 닌 지 를 판단 하 는 데 쓰 인 다.

4.1 join 방법 실현 원리 에 대한 의문
그렇다면 이 럴 때 분명 의문 이 있 는 친구 들 이 있 을 것 이다.join()방법 만 wait()방법 을 호출 했 지만 notify()나 notify All()시 리 즈 를 호출 하 는 깨 우 는 방법 을 보지 못 했다.어떻게 깨 웠 을 까?깨 우지 않 으 면 기다 리 고 있 지 않 겠 는가?
원래 자바 에 서 는 Thread 클래스 스 레 드 가 run()방법 을 실행 한 후 notify All()방법 을 자동 으로 실행 합 니 다.
 이것 은 notify All()의 매우 중요 한 숨겨 진 지식 점 입 니 다.이 디 테 일 은 자바 의 Native 방법 에 숨겨 져 있 기 때문에 일반적으로 발견 되 지 않 습 니 다.우 리 는 C/C++소스 코드 를 관찰 합 니 다.다음 과 같 습 니 다.

oid JavaThread::exit(booldestory_vm, ExitTypeexit_type);
static void ensure_join(JavaThread*thread) {
	Handle threadObj(thread, thread -> threadObj());
	ObjectLocker lock(threadObj, thread);
	thread -> clear_pending_exception();
	java_lang_Thread::set_thread_status(threadObj(), java_lang_Thread::TERMINATED);
	java_lang_Thread::set_thread(threadObj(), NULL);
     //     notifyAll()  
	lock.notify_all(thread);
	thread -> clear_pending_exception();
}
그 중에서ensure_join은 join()방법 을 실행 하 는 것 이다.등 방법 이 실 행 될 때 이 줄 코드lock.notify_all(thread);notifyAll()를 통 해 모든 대기 스 레 드 를 깨 웠 다 는 뜻 이다.따라서 스 레 드 를 사용 할 때 는 특히 주의해 야 한다. 
자바 다 중 스 레 드 join()방법의 역할 과 실현 원리 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 다 중 스 레 드 join()내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기