[英]Java: why Thread.sleep() and yield() are static?
為什么sleep()
和yield()
方法在java.lang.Thread
class
被定義為static
方法?
代碼只會在someXThread
正在執行時執行,在這種情況下,告訴someYThread
屈服將毫無意義。 因此,由於唯一值得調用yield
的線程是當前線程,因此它們使方法static
因此您不會浪費時間嘗試在 其他線程上調用yield
。
這是因為每當您調用這些方法時,它們都會應用到正在運行的同一線程上。 您不能告訴另一個線程執行某些操作,例如sleep()
或wait
。 所有操作都在當前正在執行的線程上執行。
如果您調用yield
或sleep
方法,它適用於當前正在執行的任何線程,而不是任何特定線程 - 您不必指定當前正在運行哪個線程來釋放處理器。
同樣的原因是 stop() 和 suspend() 方法被棄用的原因。 從外部侵入線程狀態是危險的,並且會導致不可預知的結果。 例如,如果睡眠不是靜態的,你認為它會如何中斷?
它們是靜態的,因此可以避免覆蓋概念,即
當使用父類引用調用它們以保持子類對象的情況時,它實現了方法隱藏概念,並且由於靜態方法性質而不會覆蓋,即父類(此處為線程類)方法將運行,具有完整的睡眠和產量功能。
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 A
和thread B
。 現在考慮sleep
方法上下文中的兩種可能情況,這同樣適用於yield
。
thread A
在thread B
對象上調用sleep
,即B.sleep()
,則 B 不在執行中,因為當前正在執行的線程是thread A
,因此在非thread A
調用sleep
執行方法毫無意義。synchronized
塊內或線程持有鎖時定義sleep
。 但是,假設thread A
在thread B
持有鎖時(或在synchronized
塊內)調用thread B
上的sleep
方法, thread B
將進入睡眠狀態持有鎖,這是完全不可取的。這些只是迫使 jvm 不允許線程在另一個線程 obect 上調用 sleep 的幾種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.