2014-06-06 79 views
0

當我運行我的程序,我看到下面的輸出 -線程啓動方法返回返回

Type something Hello Hello Hello -

我的問題是爲什麼類型的東西聲明甚至可以打印? proc1.start()調用run方法,並且由於run方法中有一個無限循環,所以它永遠不會從run方法中出來。 Thread.sleep(100)是否會造成這種情況?有人可以解釋嗎?我明顯錯過了一些簡單的東西。下面是代碼 -

public class Processor extends Thread { 
private boolean running = true; 

public void run() { 
    try { 
     while (running) { 
      System.out.println("Hello"); 
      Thread.sleep(100); 
     } 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

public void shutdown() { 
    running = false; 
} 

public static void main(String[] args) { 
    Processor proc1 = new Processor(); 
    proc1.start(); 

    System.out.println("Type something"); 
    Scanner scan = new Scanner(System.in); 
    scan.nextLine(); 

    proc1.shutdown(); 
    } 
} 
+0

您的標題表達了您認爲錯誤的應該發生的事情,而不是實際發生的事情, – EJP

回答

3

「打印某物」的原因被打印出來是因爲通過調用proc1.start(),您正在啓動另一個Thread。此Thread同時運行與主線程。所以,實際上這段代碼有2個線程。主線程負責打印「鍵入內容」,處理器Thread負責每100秒打印一次「Hello」。

當您撥打proc1.start()時,該行的代碼行確實是而不是。相反,程序會調用該行,開始ProcessorThread然後繼續運行main。

+0

很好解釋。謝謝。 – rickygrimes

2

線程的整點是讓你在並行運行的代碼。因此,就像您可以在音樂播放器仍在運行並播放您最喜愛的音樂時啓動Excel一樣,您的「Hello循環」與您的其他程序(即「鍵入內容」)並行執行。爲了保持這種比喻,你的proc1.start()就相當於啓動Excel。

對於一個深入的解釋,你可以閱讀關於Java Thread class或看看這個Java Multithreading Tutorial或更多的技術介紹,有Lesson on Concurrency from the "official" Java tutorials

一個快速的「買方當心」:多線程和併發是極其複雜的概念,可能會導致各種難以追蹤程序中的錯誤。如果程序中的兩個線程同時訪問a,即使是愚蠢的東西如a = a + 1也會失敗。您可能需要做相當多的閱讀和試​​驗。

+0

那麼多少個線程最終會運行我的程序? – rickygrimes

+0

同意,1+。另外,作爲一個旁觀者,運行應該是「易變的」。 –

+0

二。一個用於主程序,另一個用於「Hello-loop」。 –

-1
Thread.sleep(100); 

需要刪除。如果你只是運行線程,那麼在線程開始其無限循環之前,編譯器將沒有時間打印「類型」行。線程與主要方法協同工作而不是針對它。

+1

不正確!您的計算機有多個核心,可以同時執行這些線程。即使您的計算機只有一個處理器,您的操作系統也會自動執行所有不同的線程,以達到相同的效果。另外,如果你看看上面的輸出,在第一個「Hello」之前打印「Type something」,所以Thread.sleep還沒有發生。 –