在Thread.sleep()JavaDoc 中,它指出:
使當前正在執行的執行緒休眠(暫時停止執行)指定的毫秒數,取決于系統計時器和調度程式的精度和準確性。該執行緒不會失去任何監視器的所有權。
我的問題是:如果執行緒 A 持有監視器并進入睡眠狀態,那么執行緒調度程式將選擇另一個可運行的執行緒 B 并運行它。但是如果執行緒 B 需要那個監視器,那么它將被阻塞,并且依賴監視器的任何其他執行緒都將被阻塞,直到執行緒 A 從睡眠狀態恢復并開始運行并釋放該監視器,這是不是非常低效
uj5u.com熱心網友回復:
是的。
你還期待什么答案?
如果你拿著顯示幕,顯然不要睡覺。而是使用等待和通知。
下面是當你使用 wait 時會發生什么,你呼叫一個物件,如果你想使用它,你必須保持監視器:
synchronized (foo) {
do stuff()
foo.wait();
do more stuff();
}
當呼叫 wait() 時,首先,執行緒釋放監視器。接下來,它只會轉動拇指并等待某人或任何人notify()對同一參考 ( foo.notify())進行呼叫。此時,該wait()方法已釋放,但仍將等待,因為它現在需要重新獲取該監視器才能繼續。這必然不會立即發生,因為notify()除非您拿著顯示幕,否則無法呼叫。
這很好地解決了您的問題:您可以在釋放該監視器的同時讓執行緒休眠(但它不會釋放其他監視器)。
但更普遍的是,使用這些低級 API 幾乎從來都不是正確的做法。有一些抽象,主要在java.util.concurrent包中,要好得多。您應該打開 javadoc 并仔細閱讀。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/391653.html
上一篇:了解C#中的信號量
