2014-07-11 4 views
2

제 질문은 혼란 스러울 수 있지만 실제로는 매우 간단합니다. 다른 Runnable 인스턴스를 시작하는 Runnable이 있습니다. 그래서 기본적으로 :Runnable 내에서 Runnable을 시작 하시겠습니까?

runnable1 -> runnable2 runnable2이 살아 또는 runnable1 마무리 할 때 runnable2가 시작 않는

이만큼 살아 남기 runnable1합니까?

Runnable runnable1; 
Runnable runnable2; 

runnable1 = new Runnable() 
    { 
     public void run() 
     { 
      runnable2 = new Runnable() 
      { 
       public void run() 
       { 
        //Code here 
       } 
      }; 
      (new Thread(runnable2)).start();//Now that runnable 2 is started, does runnable 1 temrinate?? 
     } 
    }; 

(new Thread(runnable1)).start();//This starts first 
+1

runnable2를 실행하는 스레드에서 join()을 호출하면 그렇지 않습니다. 그렇지 않은 경우 – white

+0

신속한 응답을 보내 주셔서 감사합니다. 그래서 그대로두면 runnable1은 runnable2를 시작하자 마자 종료됩니다. 죄송합니다. 중복 확인 만하십시오. – Aci89

+1

예, 맞습니다. – white

답변

4

짧은 대답은 아니오입니다.

긴 답변. 스레드가 독립적으로 실행됩니다. main 메서드를 사용하는 것과 마찬가지로 을 시작하면 main 메서드는 시작을 호출하고 continue 스레드가 독립적으로 실행됩니다.

runnable1이 runnable2가 완료 될 때까지 대기하도록하려면 다음을 수행하십시오. 당신은 더 명확하게하려면

"runnable2이 살아 또는 runnable2가 시작될 때 runnable1 마무리처럼만큼 살아 남기 runnable1합니까?"join()

사용할 수 있습니다

중 하나가 올바르지 않습니다. 어느 스레드가 CPU 시간을 먼저 가져야하는지에 따라 다릅니다.

+0

감사합니다. 매우 명확한! – Aci89

4

Thread은 시작한 코드와 관계가 없습니다. 따라서 코드에서 runnable2이 여전히 실행 중일 경우 run()의 끝에 도달하면 runnable1을 실행하는 Thread이 중지됩니다.

원하는 내용이 아닌 경우 다른 스레드에서 Thread.join()을 사용해야합니다.

1

되지 않음 대답 (다른 사람이 이미 완료했다)하지만, ...

... 당신은 "Runanble"고 말했다하지만 문제는 정말 스레드에 관한 것입니다. Runnable은 인터페이스입니다. 오브젝트가 Runnable를 구현하고있는 경우는, 오브젝트가 public void run() 메소드를 가지고있는 것을 의미합니다. 그것은 무엇이든 다른 것을 의미하지는 않습니다. 만약 당신이 쓴 클래스라면, run() 메소드는 당신이 쓴 것을 할 것이고, 더 할 것도없고 덜 할 것도 없을 것입니다.

Runnable 객체를 새 스레드에 제공 한 다음 스레드의 start() 함수를 호출하면 흥미로운 점이 있습니다. 하지만 그 전에 스레드 (작은 t)와 Thread (큰 T) 개체의 차이를 아는 것이 중요합니다. 작은 쓰레드는 프로그램의 코드를 통한 독립적 인 실행 경로입니다. big-T Thread는 작은 스레드를 만들고 관리하는 데 사용할 수있는 Java 라이브러리 객체입니다.

작은 t 스레드는 t.start()를 호출 할 때까지 존재하지 않습니다. 일단 시작되면 초기화를 수행하고 run() 메서드를 호출 한 다음 run() 메서드가 반환되면 종료 될 때까지 정리를 수행합니다.


다른 답변에서 이미 언급했듯이 Java 언어는 스레드 간의 부모/자식 관계를 인식하지 못합니다. 어떤 Thread 객체 t가 존재할 때, 그것에 대해 알고있는 다른 스레드는 t.join()을 호출하여 스레드가 죽을 때까지 기다릴 수 있습니다 ...

... 또는 아닙니다. 전적으로 당신에게 달려 있습니다. 코드가 부모/자식 관계를 존중하도록 작성된 경우이를 수행 할 수 있습니다. 사실 꽤 일반적인 관행이지만 언어에 의해 강제되는 것은 아닙니다.