2012-03-01 1 views
1

"this"는 현재 클래스의 멤버를 나타내는 데 사용됩니다. 나는 멀티 쓰레딩을 사용하는 자바 프로그램을 시도하고 있었다."this"를 Thread 생성자에 전달하는 이유는 무엇입니까?

가 참조되는 현재의 클래스 => 객체

프로그램 수행이 스레드() 생성자 무엇

class Thread_child implements Runnable{ 
    Thread t; 

    Thread_child() 
    { 
     t = new Thread(this,"DemoThread"); 
     System.out.println("ChildThread:"+t); 
     t.start(); 
    } 
    public void run(){ 
    char a[] = {'A','B','C','D','E','F','G','H','I','J'}; 
    try{ 
     for(int i=0;i<10;i++){ 
      System.out.println("ChildThread:"+i+"\t char :"+a[i]); 
      Thread.sleep(5000); 
     } 
    } 
    catch(InterruptedException e){ 
     System.out.println("ChildThread Interrupted"); 
    } 
     System.out.println("Exiting from the Child Thread!"); 
    } 
} 
class Thread_eg{ 

    public static void main(String args[]){ 
     new Thread_child(); 
     try{ 
      for(int i=1;i<=10;i++){ 
      System.out.println("MainThread:"+i); 
      Thread.sleep(3000); 
     } 
     } 
     catch(InterruptedException e){ 
      System.out.println("MainThread Interrupted"); 
     } 
     System.out.println("Exiting from the Main Thread!"); 

    } 

} 

이다. 왜 우리는 매개 변수로 'this'를 전달해야할까요? 매개 변수를주지 않고 실행하려고했지만 하위 스레드는 실행되지 않았습니다. 주 스레드 만 인쇄되었습니다. 스레드 생성자를 매개 변수로 바꾼 경우 자식 스레드가 실행되었습니다. 왜 이렇게이다?

+0

이 http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html –

+0

그것은 변경되지 않았습니다 :

는이 같은 스레드의 run는 모습입니다 , 그러나 나는 6을 연결했다. –

+3

완전히 별개의 문제로서, 일관된 들여 쓰기와 포맷을 사용하여 코드가 사람에 의해 더 많이 읽을 수있게 만들었 기 때문이다. 2 개의 닫는 중괄호를 서로 직접 아래에 배치하는 것은 나쁜 신호이며'Thread_eg'에서'main' 메쏘드가 중간에 끝나는 것처럼 보입니다. –

답변

3

해당 생성자에 대해 documentation을 살펴보면 모든 것이 명확 해집니다. target 인수가이 스레드가 시작될 때 targetrun 메소드가 불려, null없는 경우

을 명시하는 부분에 특히주의를 기울이십시오. 대상 인수가 null 인 경우이 스레드가 시작될 때이 스레드의 run 메서드가 호출됩니다.

(근본적인 문제는 스레드가 단지 스레드이며, 본질적으로 당신은 실행하기 위해 무엇을 이야기해야합니다. 아무것도하지 않습니다.)

+0

다음과 같이 설명 할 수 있습니다. "이 스레드의 실행 메소드는"this * Thread 객체의 * run 메소드로 읽어야합니다. "; 이 경우 사용하고자하는'run'은'Thread_child' * 객체 *의 것이고 새로운'Thread' * 객체는 아닙니다 (기본적으로 아무것도하지 않을 것입니다). 다른 방법은 스레드를 서브 클래스 화하고 거기에서 실행을 오버라이드하여 무언가를 수행하는 것입니다. (Thread 객체 *는 쓰레드를 표현/관리/추상화하는 * 객체 *와 마찬가지로 /보다 더 많은 쓰레드입니다.) –

+0

@pst 뒤 부분은 사실입니다 - 자바에서 쓰레드의 추상화입니다 물론 수준. 내가 간파하고 싶었던 것은'java.lang.Thread'가 실제로 아무 것도 실행하지 않는다는 것입니다. Runnable을 전달하거나'run()'을 오버라이드 (override) 할 필요가 있습니다. 그것이 내가 겪고 자했던 것입니다. 그리고 그 맥락에서, 생성자를 변경하여 더 이상 Runnable을 제공하지 않는다면 Runnable이 더 이상 실행되지 않는다는 것이 정말로 놀라운가요? :) –

+0

나는이 대답에 동의한다. :) 문서는 또한 더 나은 문구를 사용할 수 있습니다 ...하지만 어쩌면 그게 나야. –

3

thisRunnable 객체 (때문에 Thread_child)의 run() 메서드가 호출됩니다.

0

스레드를 구현하는 두 가지 방법이 있습니다. 하나는 extends Thread 클래스를 만들고이 클래스는 VM에서 스레드로 실행됩니다.

MyThread mt = new MyThread(); 
mt.start(); 

시작은 Thread에서 재정의 된 run 방법의 실행으로한다.

Thread으로 확장 할 수없는 경우 Runnable을 구현하면 run 방법을 구현할 수 있습니다. 이제이 클래스를 실행하려면 객체를 Thread에 전달해야합니다. 코드에서

MyRunnable mr = new MyRunnable(); 
Thread t = new Thread(mr); // telling the thread what needs to be execute through run method 
t.start(); 

당신이 생성자에서 스레드를 시작하고 있기 때문에, 대신 내 mr 위의 예에서 this을 통과했다. 기본적으로 Threadrun 방법을 통해 필요한 조치를해야합니다.

public void run() { 
if (target != null) { //target is nothing but a Runnable. 
    target.run(); 
} 
} 
관련 문제