2013-01-04 3 views
1

멀티 스레딩에 익숙하며 몇 가지 질문과 혼란이 생겼습니다. :)멀티 스레딩 콘솔 출력이 다르다

public class NewThread implements Runnable { 

    Thread t; 

    NewThread() { 
     t = new Thread(this, "Demo Thread"); 
     System.out.println("Child Thread " + t); 
     t.start(); 
    } 

    @Override 
    public void run() { 

     try { 
      for (int i = 5; i > 0; i--) { 
       System.out.println("Child Thread: " + i); 
       Thread.sleep(500); 
      } 
     } catch (InterruptedException e) { 
      System.out.println("Child Interrupted."); 
     } 

     System.out.println("Exiting Child Thread."); 
    } 

} 

class ThreadDemo { 

    public static void main(String[] args) { 

     NewThread t = new NewThread(); 

     try { 
      for (int i = 5; i > 0; i--) { 
       System.out.println("Main Thread: " + i); 
       Thread.sleep(1000); 
      } 
     } catch (InterruptedException e) { 
      // TODO: handle exception 
      System.out.println("Main Thread Interrupted."); 
     } 

     System.out.println("Main Thread Exiting."); 
    } 

} 

예외 처리 출력

enter image description here

내 출력

enter image description here

왜 내 콘솔 출력이 예상 출력 다릅니 까? 고맙습니다.

+0

당신은'NewThread t = new NewThread(); –

+0

그래, 그렇게 보입니다. – AppSensei

+0

src가 정상적으로 보인다. 그리고 당신의 근원을 실행할 수 있고 적당한 산출을 얻고있다. 여기에 게시 된 src가 테스트중인 src와 같은지 확인하십시오. – Jayamohan

답변

0

NewThread 클래스의 변수 tNewThread 유형이 아니므로 하위 스레드 루프를 실행하지 않습니다. NewThread 객체에서 start()를 호출하지 않으므로 실행 결과가 표시되지 않습니다.

System 개체는 정적이며이 VM에서 실행되는 모든 스레드에서 공유됩니다.

+1

Start() 메소드가 _NewThread_ class의 생성자에서 호출 중입니다. 그걸 확인해 봤어? – Jayamohan

+0

코드로 작성할 수 있습니까? – AppSensei

+0

코드를 실제로 실행 한 후에 "예상 출력"을 얻으려고합니다. –

-3
class ThreadDemo { 

public static void main(String[] args) { 

    NewThread t = new NewThread(); 

    try { 
     for (int i = 5; i > 0; i--) { 
      System.out.println("Main Thread: " + i); 
      Thread.sleep(1000); 
      t.run(); //// forgot here 
     } 
    } catch (InterruptedException e) { 
     // TODO: handle exception 
     System.out.println("Main Thread Interrupted."); 
    } 

    System.out.println("Main Thread Exiting."); 
} 

}

추가 t.run();

+1

스레드의 요점은 무엇입니까? "main()"에서 "t.run()"을 호출하면, ''수동 방법? –

+0

@ user1947279't.run()'호출은 메인 스레드에서 실행될뿐만 아니라 for-loop의 각 반복에서 실행됩니다. – Ryan

0

문제는 NewThread 클래스의 생성자가 호출되지 않는다고 생각합니다. 생성자

NewThread() { 
     <STUFF> 
    } 

에 대한 이상한 부분은 즉 그것이 public 키워드 누락, 액세스 수정이 doen't 것입니다. 이는 생성자를 package-private로 만듭니다. 당신의 ThreadDemo 클래스가 다른 패키지에있는 경우는 생성자를 볼 수 없습니다, 생성자는 이후 나는 때문에 그냥 public를 추가해야한다고 생각 당신이

NewThread t = new NewThread(); 

를 호출 할 때 실행되지 않습니다 키워드를 생성자에게 보내면 모든 것이 좋습니다. 또는 NewThreadThreadDemo 클래스를 같은 패키지에 넣으십시오.

+0

@Appsherif 이것이 맞는지, 그렇다면 대답을 받아 들일 수 있습니까? ? – MarcFasel

0

코드가 게시되었습니다. 나는 당신의 예상 결과를 얻었다!

나는 당신이 당신의 주에서 다른 변수 "T"와 변수 "t"를 재정의 다른 코드를 시작되었는지 생각한다. 아마도 코드의 일부를 정적으로 선언했을 것입니다.