簡體   English   中英

Java:為什么 Thread.sleep() 和 yield() 是靜態的?

[英]Java: why Thread.sleep() and yield() are static?

為什么sleep()yield()方法在java.lang.Thread class被定義為static方法?

代碼只會在someXThread正在執行時執行,在這種情況下,告訴someYThread屈服將毫無意義。 因此,由於唯一值得調用yield的線程是當前線程,因此它們使方法static因此您不會浪費時間嘗試在 其他線程上調用yield

這是因為每當您調用這些方法時,它們都會應用到正在運行的同一線程上。 您不能告訴另一個線程執行某些操作,例如sleep()wait 所有操作都在當前正在執行的線程上執行。

如果您調用yieldsleep方法,它適用於當前正在執行的任何線程,而不是任何特定線程 - 您不必指定當前正在運行哪個線程來釋放處理器。

這個論壇里有類似的帖子

同樣的原因是 stop() 和 suspend() 方法被棄用的原因。 從外部侵入線程狀態是危險的,並且會導致不可預知的結果。 例如,如果睡眠不是靜態的,你認為它會如何中斷?

它們是靜態的,因此可以避免覆蓋概念,即

當使用父類引用調用它們以保持子類對象的情況時,它實現了方法隱藏概念,並且由於靜態方法性質而不會覆蓋,即父類(此處為線程類)方法將運行,具有完整的睡眠和產量功能。

http://i.stack.imgur.com/goygW.jpg

sleep 和 yield 方法都是原生的。 為了更好地理解上述答案,我使用相同的靜態方法創建了兩個類 ClassA 和 ClassB。 我調用了其他類的方法來檢查它的行為。 所以我們可以調用其他類的靜態方法。
因此,使 sleep 方法靜態化可能還有其他原因。

public class ClassA {

    public static void method(){
        System.out.println("Inside ClassA method");
    }

    public static void main(String[] args) {
        method();
        ClassB classb = new ClassB();
        classb.method();
    }
}

    public class ClassB {
    public static void method(){
        System.out.println("Inside ClassB method");
    } 

}

我知道我參加這個聚會遲到了,(責怪我的父母 :-))我想用反證法來回答這個問題。 假設sleep方法不是static因此您可以在任何其他線程對象上調用 sleep 。

假設有兩個線程, thread Athread B 現在考慮sleep方法上下文中的兩種可能情況,這同樣適用於yield

  1. 具有單處理器的系統一次只有一個線程處於活動狀態,因此如果thread Athread B對象上調用sleep ,即B.sleep() ,則 B 不在執行中,因為當前正在執行的線程是thread A ,因此在非thread A調用sleep執行方法毫無意義。
  2. 負責任的程序員永遠不會在synchronized塊內或線程持有鎖時定義sleep 但是,假設thread Athread B持有鎖時(或在synchronized塊內)調用thread B上的sleep方法, thread B將進入睡眠狀態持有鎖,這是完全不可取的。

這些只是迫使 jvm 不允許線程在另一個線程 obect 上調用 sleep 的幾種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM