2013-10-14 2 views
0

이 코드를 이해하는 데 문제가 있습니다. 나는 자바에 대한 2 시간의 지식 만 갖고있다. 여기 기본 Java 스레딩 및 실행 가능 패턴

코드입니다 :

// Create a new thread. 
class NewThread implements Runnable { 
    Thread t; 
    NewThread() { 
     // Create a new, second thread 
     t = new Thread(this, "Demo Thread"); 
     System.out.println("Child thread: " + t); 
     t.start(); // Start the thread 
    } 

    // This is the entry point for the second thread. 
    public void run() { 
     try { 
     for(int i = 5; i > 0; i--) { 
      System.out.println("Child Thread: " + i); 
      // Let the thread sleep for a while. 
      Thread.sleep(50); 
     } 
    } catch (InterruptedException e) { 
     System.out.println("Child interrupted."); 
    } 
    System.out.println("Exiting child thread."); 
    } 
} 

public class ThreadDemo { 
    public static void main(String args[]) { 
     new NewThread(); // create a new thread 
     try { 
     for(int i = 5; i > 0; i--) { 
      System.out.println("Main Thread: " + i); 
      Thread.sleep(100); 
     } 
     } catch (InterruptedException e) { 
     System.out.println("Main thread interrupted."); 
     } 
     System.out.println("Main thread exiting."); 
    } 
} 

그리고 여기의 출력 : 여기에

Child thread: Thread[Demo Thread,5,main] 
Main Thread: 5 
Child Thread: 5 
Child Thread: 4 
Main Thread: 4 
Child Thread: 3 
Child Thread: 2 
Main Thread: 3 
Child Thread: 1 
Exiting child thread. 
Main Thread: 2 
Main Thread: 1 
Main thread exiting. 

내 질문입니다.

코드가 따르는 패턴을 이해하고 싶습니다. 저에 따르면,

  • 우선, 프로그램은 main() 기능을 실행하기 시작해야합니다. 따라서 NewThread의 인스턴스를 초기화해야합니다.
  • 그럼, 내가 NewThread 생성자로 가서 온다) (즉 t.start 후 Child thread: Thread[Demo Thread,5,main]
  • 를 작성해야하기 때문에 프로그램 public void run()에서 (?? 내가 잘못 여기 AM) public void run()

을 실행해야 내가 출력 Child Thread 5을 얻어야한다고 생각하지만, 대신 Main Thread 5을 얻었습니다. 나는 왜 궁금해하니 ??

나를 도울 사람이 있습니까 ?? 미리 감사드립니다.

+0

Wonderful : Java threating ... :-) – Seelenvirtuose

답변

2

t.start()은 새 스레드를 만들고 그 중에서 run()을 호출합니다. 이 시점에서 두 스레드가 독립적으로 실행됩니다. 하나는 start()이고 다른 하나는 새로운 스레드입니다. 원래 스레드는 생성자에서 반환 된 다음 main() 메서드에서 루프 실행을 시작합니다.

두 스레드가 독립적이므로 어떤 스레드가 먼저 System.out.println에 대한 호출에 도달하는지 보장 할 수 없습니다. 여러분이 제시 한 샘플 출력에서, 원래의 스레드가 먼저 인쇄되게됩니다. 그것은 쉽게 다른 방향 라운드 발생할 수 있습니다.

제쳐두고, Java를 처음 사용하는 사람이라면 의 기초를 배우고 나서 전에 스레딩 할 것을 제안합니다. 귀하의 질문에 혼란 스럽다는 것을 나타내는 것은 없지만 스레딩은 상대적으로 진보 된 주제입니다. IMO를 사용하기 전에 일반적인 언어 동작에 익숙해 져야합니다. 그런 식으로 당신이 볼 수있는 이상한 행동은 스레딩 때문이며 언어의 다른 부분을 오해하지 않기 때문입니다.

+0

답장을 보내 주셔서 감사합니다. 자, t는 스레드 맞습니까? 그리고 t.start()는 예를 들어 z라는 새로운 쓰레드를 만듭니다. t.start() 직후에 정확히 두 개의 쓰레드 t와 z를 가졌습니까? – Bambi

+0

@Bambi : 음,'t'는 변수입니다. 이 값은 실제 쓰레드와 같지 않은'Thread' 객체에 대한 참조입니다. 예를 들어, 새로운'Thread' 객체를 만들면 * 시작되지 않은 OS 스레드를 만들 수 있습니다. 또는 당신이'start()'를 호출 할 때까지 기다릴 수 있습니다. 실행 흐름을 위해서, 당신이'start() '를 호출 할 때까지는 실행 스레드가 하나 밖에 없다. –

+0

나는 당신의 대답에 정말 놀랍다. 나는 작은 자바 게임과 처음으로 비디오 튜토리얼을 만드는 것에 익숙해 져야한다. 클래스가 runnable을 구현하는 것을 보았다. 그리고 나는이 재료를 가지고 온다. – Bambi