2011-05-03 4 views
14

자바 스레드 join() 메서드는 다소 혼란 스럽습니다. 나는 어떤 순서에서 스레드가 종료됩니다 예를join() 메서드 예제 이해

class MyThread extends Thread { 
    private String name; 
    private int sleepTime; 
    private Thread waitsFor; 

    MyThread(String name, int stime, Thread wa) { … } 

    public void run() { 
     System.out.print("["+name+" "); 

     try { Thread.sleep(sleepTime); } 
     catch(InterruptedException ie) { } 

     System.out.print(name+"? "); 

     if (!(waitsFor == null)) 
     try { waitsFor.join(); } 
     catch(InterruptedException ie) { } 

     System.out.print(name+"] "); 

그리고

public class JoinTest2 { 
    public static void main (String [] args) { 
     Thread t1 = new MyThread("1",1000,null); 
     Thread t2 = new MyThread("2",4000,t1); 
     Thread t3 = new MyThread("3",600,t2); 
     Thread t4 = new MyThread("4",500,t3); 
     t1.start(); 
     t2.start(); 
     t3.start(); 
     t4.start(); 
    } 
} 

을 다음습니까?

+4

이것은 까다로운 질문입니까? 아니면 숙제? :) – bzlm

+0

그냥 일부 전자 서적을 읽고 그 예제를 발견, 실제로 실행 스레드가 조인이 끝나기 위해 호출 된 스레드를 기다립니다, 어쩌면 내가 오늘 종료 : D –

+0

스레드가 죽을 때까지 기다립니다. http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html#join() –

답변

12

무엇이 실제로 Thread.join()을 혼란스럽게합니까? 당신은 구체적인 것을 언급하지 않았습니다.

Thread.join() Waits for this thread to die ( the documentation states로), 다음 t4t1가 완료 될 때까지 대기하는 완료 t2 기다릴 것이다, 완료 t3을 기다리는 것을 감안할 때.

따라서 , t3t4이 먼저 완료됩니다.

6

t1, t2, t3, t4 ... join은 현재 실행중인 스레드가 호출 된 스레드가 종료 될 때까지 대기하도록합니다.

2

t1, t2, t3 및 t4를 생성 한 4 개의 세관 스레드를 시작하는 메인 스레드가 있습니다. 이제 스레드에서 join() 메서드가 호출되고 인수 (시간)가 제공되지 않으면 (기본적으로 최대 대기 시간이 영원한 것을 의미하는 0이되는 경우) 호출 스레드는 결합이 호출 된 스레드가 종료 될 때까지 대기합니다.

t1.start()가 호출되면 해당 run() 메소드가 JVM에 의해 호출됩니다. waitsFor 인수는 t1의 경우 null이므로 해당 이름을 인쇄하여 종료됩니다. sleep t2, t3을 추가하기 때문에 t1은 t1이 완료 될 때까지 시작됩니다. 이제 t2는 t2에서 t1에 대해 join을 호출 할 때 t1이 종료 될 때까지 대기합니다. 마찬가지로 t3은 t2를 기다리고 t4는 t3을 기다립니다. 따라서 실행은 t1->t2->t3->t4이 될 것입니다.

그러나 t2가 t2에 참여하기 전에 종료되면 그 시점 (t2에서 t1을 호출 할 때) isAlive()false이 될 것이기 때문에 결합이 단순히 리턴됩니다.