2016-04-14 135 views
3

當調度線程執行時,是否有任何關於公平JVM的假設?調度線程時JVM的公平性

對於下面的代碼片段,是否有可能只執行「代碼A」,而忽略B?

public static void main(String args[]) { 

    new Thread() { 
     public void run() { 
     for (;;) { /* code A */ } 
     } 
    }.start(); 

    new Thread() { 
     public void run() { 
     for (;;) { /* code B */ } 
     } 
    }.start(); 

} 

的問題是,更高的理論之一 - 假設是,無論是線程被阻塞或以其他方式鼓勵調度切換上下文。

+0

您的操作系統最有可能支持搶先式多任務處理,在這種情況下,它會切換這些線程。如果你有多個可用的CPU,它們都會運行大部分時間。 –

+0

好點重新CPU號碼。正在考慮只有一個CPU場景。 –

+0

現在大多數電腦都有很多CPU,甚至手機和樹莓派。 ;) –

回答

2

當談到調度執行線程時,是否有關於公平JVM的假設?

對於以下片斷,是有可能有僅執行時,與B 「代碼A」 被忽略?

理論上是。

在實踐中:

  • 如果有一個(有)的核心,我希望在操作系統級的線程調度器時間片的線程,使他們各得了的可用時間約50%如果有多個(可用)內核,我希望這兩個線程並行運行。


注意,無論是JLS或JVM規範說,大約線程調度和公平性東西。對於Thread,javadoc也沒有。

據我所知,唯一提到公平的Java API是ReentrantLock API(javadoc),其中有一個用公平策略創建鎖的構造函數參數。這意味着調度器支持一直等待鎖上最長的線程。但是,即使是這樣:

「但請注意,鎖的公平性並不能保證線程調度的公平性。」

+2

這假定只有一個CPU。在帶有備用CPU的多CPU系統上,幾乎可以一直運行。 +1 –