2013-10-13 66 views
-2

我是新來的Java和多線程的概念。這裏是我的實驗代碼:多線程輸出預計不到

public class Multithread implements Runnable { 

    Thread t; 

    public Multithread(int prior, String name) { 
     this.t = new Thread(this, name); 
     this.t.setPriority(prior); 
     this.t.start(); 
    } 

    public void run() { 
     for (int i = 1; i <= 5; i++) { 
      if (this.t.getName().equals("thread1")) { 
       System.out.println("First Child Thread Loop No " + i); 
      } 
      else { 
       System.out.println("Second Child Thread Loop No " + i); 
      } 

      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       System.out.println(e); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     new Multithread(10, "thread1"); 
     new Multithread(7, "thread2"); 
    } 
} 

輸出是:

First Child Thread Loop No 1 
Second Child Thread Loop No 1 
First Child Thread Loop No 2 
Second Child Thread Loop No 2 
Second Child Thread Loop No 3 
First Child Thread Loop No 3 
Second Child Thread Loop No 4 
First Child Thread Loop No 4 
Second Child Thread Loop No 5 
First Child Thread Loop No 5 

嗯,我預計會有這樣簡單:

First Child Thread Loop No 1 
Second Child Thread Loop No 1 
First Child Thread Loop No 2 
Second Child Thread Loop No 2 
First Child Thread Loop No 3 
Second Child Thread Loop No 3 
First Child Thread Loop No 4 
Second Child Thread Loop No 4 
First Child Thread Loop No 5 
Second Child Thread Loop No 5 

我期望能獲得前總是執行第一線第二個線程。 請解釋我的輸出。提前致謝。

+1

我永遠不會理解這些問題。如果你想要一個特定的執行順序,爲什麼你使用線程? – EJP

+0

@EJP我認爲這種程序只是一個不懂線程並想學習的人編寫的測試。 –

+0

@Patricia雅正好。我只是想學習與多個線程 –

回答

4

下面是在您的程序中考慮多線程的模型。想象一下,兩個人,即Thread1和Thread2獨立工作,分別在不同的房間裏,每個人都按自己的步調和不同的茶歇時間表。每個人都可以訪問共享的紙張並添加一行。

假設除了一次只能寫一篇文章的規則之外沒有任何協調,你會對他們的行將如何交錯有何期待嗎?

編輯============================================= =============

計算機線程並不都以相同的有效速度運行。人們可能會遇到不同的緩存未命中。除非系統完全專用於這一個應用程序,否則難以實現的狀態會導致處理器的中斷和時間共享,從而減慢一個線程的速度。

+0

以及在這裏的答案和評論。只有你通過暗示我真實生活的例子來理解我的問題。我已經理解了多線程與我認爲的不同,但我仍無法在你的回答中「按自己的步調」理解這條線。 –

+0

@chetanmehta我已經擴大了我在這方面的答案。 –

0

線程的基本規則:線程的工作是未定義的。可能會在一段時間後,或一小時後立即發生。沒有任何保證。

如果您想了解Java中的多線程,您應該開始熟悉concurrent package。它包含用於解決常見問題的即用型工具。更重要的是:它提供了一種處理多線程解決方案的方法,通過智能代碼設計可以避免大部分問題。