2013-07-31 79 views
0

這裏是在Java的示例程序從tutorials pointmulithreading在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. 

我很難理解爲什麼主線程在子線程之前執行。在程序中你可以看到第一個新的NewThread()被執行。 NewThread類實例化一個新線程,並在新線程上調用start()函數,然後調用run()函數。 只有在創建新線程後,主函數中的循環纔會出現。但是,當程序運行時,主線程中的循環在子線程之前運行。請幫助我理解。

+0

我看到你沒有應用任何線程同步選項。所以在啓動兩個不同的線程後,'它不在你的手上'來控制哪個線程執行時,但有一些同步選項,如延遲,優先級和join()也許你可以達到一定數量的控制..不斷學習.. – Dreamer

回答

3

主線程中的循環在子線程之前運行。請幫助我理解。

線程不必任何形式的同步默認情況下,可以在與他們的執行可能交織任何順序運行。您可以獲取鎖並使用這些鎖來確保順序,例如,如果主線程在啓動子線程之前獲取鎖,讓子線程等待獲取鎖,並讓主線程在完成任務後釋放鎖。

+0

但它的情況下,總是主線程在子線程之前運行。如果它們可以以任何順序運行,則在某些情況下,子線程應該先運行。我不明白爲什麼會發生這種情況 –

+0

@ShikharSubedi在不同的系統負載下多次運行它。沒有保證真的。這很可能是操作系統在主線程的指令中打包成一個時間片,或者是創建一個新線程導致它被延遲到主線程完成之後才能啓動的開銷。如果您爲每個線程添加更多實質性任務,您會更清楚地看到該行爲。 – hexafraction

1

Thread.start()調度要運行的線程。之後,由JVM(和操作系統)來負責調度。線程的運行方式取決於許多因素,包括您擁有的CPU /內核數量,操作系統,優先級等。

如果您需要線程以特定順序運行,請等待對方等。 ,那麼你必須使用提供的線程工具(同步,鎖等),否則它是完全隨意的。