2013-10-14 89 views
-1

我真的很困惑多線程。我知道這個事實多線程優先輸出不清除

線程是不可預知的

這是否事實,只保存線程的優先級相同?如果不是,那麼需要設置線程的優先級。

我的意思是想驗證碼:

public class Threadsync implements Runnable{ 
    Thread t; 
    String str; 
    public Threadsync(String name) 
    { 
     this.str=name; 
     this.t=new Thread(this,name); 
     this.t.start(); 
     this.t.setPriority(10); 
    } 
    public void run() 
    { 
     System.out.println("hello "+str); 
    } 
    public static void main(String[] args) 
    { 
     new Threadsync("thread1");  //1 
     new Threadsync("thread2");  //2 
     System.out.println("world");  //3 
    } 
} 

這是我的代碼,我得到了輸出 你好線程1 世界 你好線程2

有關線程1和線程,但沒有混亂,爲什麼主線程輸出消息world在thread2輸出消息hello thread2之前,即使thread2的優先級比主線程高兩倍。 在此先感謝。詳細的解釋將是非常可觀的

+0

如果您在啓動之前調用setPriority會發生什麼? – Julien

+0

@Julien沒有變化:( –

+0

但它有趣的測試:) – Julien

回答

0

當我們運行更多的線程比你CPU或你的操作系統可以處理,所以他們都在同一時間正確運行時,優先級纔會發揮。

如果您使用通知和等待方法,那麼具有最高優先級等待的線程將處於前端關閉狀態!

所以有使用優先級的原因,但請注意,如果高優先級的線程正在調用一種方法,那麼很可能低線程永遠不會鎖定在線程中。

+0

它進場時,如果OS如此決定,這並不是由Java定義的。 – EJP

+0

@EJP確實說明了這種說法是錯誤的「更高優先級的線程肯定會早於低優先級線程執行」 –

+0

是的,也沒有決定所有java線程時間片的Java虛擬機。 – JWqvist

1

當線程運行實際上是由操作系統的調度程序決定的。線程的優先級最多爲,建議您正在給操作系統 - 它可能會或可能不會使用的提示。很長一段時間,在Linux上,所有線程都以相同的優先級運行,無論它們是以編程方式設置的優先級。

簡而言之,設置線程的優先級並不能保證它何時運行,或者操作系統如何確定優先級。即使操作系統向後解釋了您的線程優先級,您的代碼也需要工作 - 也就是說,您的代碼永遠不應該假定線程優先級實際上意味着任何東西。 C.F. this advice in Effective Java

+0

儘管操作系統只給Java虛擬機一個時間片給它的代碼,然後它會運行它的線程 – JWqvist

+0

@Tim Boudreau所以我應該把setPriority當成浪費空間在我的代碼中。 –

+1

非常。如果您知道某件事情非常重要,將其設置爲高優先級(或相反)並不會造成任何負面影響,但不要依賴實際確定執行順序。 –

2

線程是不可預測的,你在哪裏說,你在哪裏的權利。 JVM在你的小線程旁邊有很多問題需要處理。即使你優先考慮,你仍然不知道&什麼時候會發生。 如果您使用更多的線程運行實驗,需要完成更多的處理並且多次執行,您將會看到...... 但即使您的不可預測性仍然非常有用。

+0

,但仍然先生有多少線程我實例化我繼續獲得「世界」作爲我的第二個輸出。所以必須有一些邏輯 –

+1

如果你將運行7線程和打印屏幕在每個線程「胎面N:我=#」其中N是線程編號,i =#是FOR循環中從1到100000000的值,您將認爲沒有邏輯,我想您可以看到優先級在這種情況下真正起作用 - 如果您將輸出打印到文件 – yossico

1

從Java語言規範:

每個線程都有一個優先事項。當存在對處理資源的競爭時,具有較高優先級的線程通常以優先級較低的線程執行,優先級爲 。然而,這樣的首選不是, 保證最高優先級的線程將始終運行 ,並且線程優先級不能用於可靠地執行 互斥

但是線程正常優先級,Thread.NORM_PRIORITY的值爲5。根據我的幾項測試,我注意到51之間的優先級設置與子線程一起工作,儘管它仍然讓Main thread首先執行,因爲Main線程的優先級爲5

+0

Bcoz主線程已獲得正常優先級,即。 5 –

+1

是的。我剛剛說過,因爲我認爲你是在我們可以優先於Main的子線程的地方。我很抱歉我的措辭有誤導性。 – Sage