2015-11-09 175 views
0

我正試圖提高我的JAVA。現在我有一個問題,我不明白線程。Java:線程問題

我試圖代碼是,

public class MyThread implements Runnable { 
    private int end; 
    private String name; 

    public MyThread(String name, int end) { 
     this.end = end; 
     this.name = name; 
    } 

    @Override 
    public void run() { 
     for (int i = 0; i < end; i++) { 
      System.out.println(name + " : " + i); 
     } 
    } 
} 

public class ThreadLesson { 
    public static void main(String[] args) { 
     Thread thread1 = new Thread(new MyThread("thread1", 6)); 
     Thread thread2 = new Thread(new MyThread("thread2", 5), "thread2"); 
     thread1.start(); 
     thread2.start(); 
    } 
} 

在教訓輸出

thread1 : 0 
thread2 : 0 
thread2 : 1 
thread2 : 2 
thread1 : 1 
thread2 : 3 
thread1 : 2 
thread2 : 4 
thread1 : 3 
thread1 : 4 
thread1 : 5 

我outout是

Thread1:0 
Thread2:0 
Thread1:1 
Thread1:2 
Thread1:3 
Thread1:4 
Thread1:5 
Thread2:1 
Thread2:2 
Thread2:3 
Thread2:4 

我的問題是, 爲什麼我出不同樣的課程輸出?有一些問題,或者誰寫了這一課,只是編輯輸出爲文章beaty。

+2

你不能事先知道將按哪個順序執行線程。如果再次運行它,你很可能會得到不同的結果。 – Averroes

回答

5

在某個地方的教訓,這可能已經寫在粗體字母您不應該期待這裏顯示的結果。您通過傳遞2個不同的可運行子程序來啓動2個線程。如果沒有適當的同步,就沒有辦法告訴輸出是什麼。

1

是的,你可能會發現在開始時很奇怪,所得到的值差別很大。事實上,當兩個或多個非同步線程被允許同時運行時,沒有辦法確定正確的輸出。

這可以理解爲

當創建的線程,他們被認爲是天生的狀態,你不使用的run()運行一個線程,但你使用start()。現在你可能會問這個邏輯背後的原因。

這是很簡單,如果你使用的run(),則處理器必須運行在那一刻,這可能會導致問題的線索。但是如果你使用start(),那麼你告訴處理器你想運行該線程。在此之後,處理器會盡快處理線程。 必須清楚的是,現代處理器同時執行許多任務。爲了實現這一點,他們可以使用循環法或搶先式調度來完成任務。 在時間切片中,每個進程都有相同數量的處理器時間。而在搶先式調度中,具有較高優先級的任務被賦予優先權。

現在,當多個線程同時運行時,它依賴於操作系統將處理器分配給任何線程。所以任何線程都可以得到可以改變你看到的輸出的處理器。

現在,如果線程已同步,那麼條件會改變,程序可以有固定的路徑。

-2

我們無法預測這種情況下的輸出模式,因爲輸出將完全取決於jvm的線程管理器。如果你想有一個預測的輸出,你可以使用Thread.sleep(timeinml)方法,因爲這將提供線程同步

+0

我可以從已經低估了我的答案的人那裏獲得理由 – Moosa