03.03 阿里高頻面試題:Java中sleep方法和wait方法的區別

來自不同的類

sleep(long millis)來自Thread類,和wait()來自Object類。

sleep(long millis)是Thread類的靜態方法,可接受一個long型入參,意為等待的毫秒數。調用該方法的線程此時會讓出CPU時間片,線程等待指定時間後進入可運行狀態重新參與CPU的競爭。


阿里高頻面試題:Java中sleep方法和wait方法的區別


舉個例子:在A線程裡調用了B線程的sleep()方法,實際上還是A線程執行sleep(),即進入等待狀態,要讓B線程進入等待狀態就要在B線程的代碼中調用sleep()。

wait()是Object類的實例方法,調用某對象的wait()方法會進入該對象鎖的等待隊列中並等待其他線程喚醒,通常與notify()/notifyAll()結合使用。

sleep()沒有釋放系統資源,而wait()釋放了系統資源。

sleep(long millis)不出讓系統資源,僅讓出CPU時間片;wait()是釋放掉系統資源並且進入到系統資源(同步對象的對象監視器)的等待隊列中等待,並且讓出CPU時間片。


阿里高頻面試題:Java中sleep方法和wait方法的區別


時間入參使用的差異

一般情況下wait()不會加時間限制,因為如果wait線程的運行資源不夠,再出來也沒用,要等待其他線程調用notify/notifyAll喚醒等待隊列中的線程,才會進入就緒隊列等待OS分配系統資源。sleep(milliseconds)可以用時間指定使它自動喚醒過來,如果時間不到只能調用interrupt()強行打斷。

Thread.Sleep(0)的作用是“觸發操作系統立刻重新進行一次CPU競爭”。

使用場景/範圍不同

wait()只能在同步控制方法或者同步控制塊裡面使用,而sleep()可以在任何地方使用


阿里高頻面試題:Java中sleep方法和wait方法的區別


聰明的你記住了嗎?

關注評論後可私信獲取更多最新大廠面試資料,更有機會獲取大牛一對一面試輔導、內部推薦

備戰金三銀四跳槽季,助力各位斬獲大廠offer


分享到:


相關文章: