자바 다 중 스 레 드 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()내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.