2013-10-14 32 views
0

我在理解此代碼時遇到問題。我只有幾個小時的Java知識。基本的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構造和寫入Child thread: Thread[Demo Thread,5,main]
  • 是t.start後()來了,所以計劃應該執行public void run()(我錯了這裏?)

public void run(),我認爲我應該得到一個輸出Child Thread 5,但我得到了Main Thread 5。我想知道爲什麼 ??

有沒有人幫我?提前致謝。

+0

精彩:Java威脅... :-) – 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

我真的很感謝你的回答,我想熟悉製作小型的java遊戲和我看到的第一個視頻教程。看到一個類實現可運行的,我比這些東西來。 – Bambi