淺談sleep與wait的區別

一、來自不一樣的類html

這兩個方法來自不一樣的類分別是,sleep來自Thread類,和wait來自Object類。linux

sleep是Thread的靜態類方法,誰調用的誰去睡覺,即便在a線程裏調用了b的sleep方法,實際上仍是a去睡覺,要讓b線程睡覺要在b的代碼中調用sleep。操作系統

二、有沒有釋放鎖(釋放資源)線程

最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其餘線程可使用同步控制塊或者方法。htm

sleep不出讓系統資源;wait是進入線程等待池等待,出讓系統資源,其餘線程能夠佔用CPU。通常wait不會加時間限制,由於若是wait線程的運行資源不夠,再出來也沒用,要等待其餘線程調用notify/notifyAll喚醒等待池中的全部線程,纔會進入就緒隊列等待OS分配系統資源。sleep(milliseconds)能夠用時間指定使它自動喚醒過來,若是時間不到只能調用interrupt()強行打斷。隊列

Thread.Sleep(0)的做用是「觸發操做系統馬上從新進行一次CPU競爭」。進程

sleep是線程被調用時,佔着cpu去睡覺,其餘線程不能佔用cpu,os認爲該線程正在工做,不會讓出系統資源,wait是進入等待池等待,讓出系統資源,其餘線程能夠佔用cpu,通常wait不會加時間限制,由於若是wait的線程運行資源不夠,再出來也沒用,要等待其餘線程調用notifyall方法喚醒等待池中的全部線程,纔會在進入就緒序列等待os分配系統資源,
sleep是靜態方法,是誰掉的誰去睡覺,就算是在main線程裏調用了線程b的sleep方法,實際上仍是main去睡覺,想讓線程b去睡覺要在b的代碼中掉sleep資源

sleep(100L)是佔用cpu,線程休眠100毫秒,其餘進程不能再佔用cpu資源,wait(100L)是進入等待池中等待,交出cpu等系統資源供其餘進程使用,在這100毫秒中,該線程能夠被其餘線程notify,但不一樣的是其餘在等待池中的線程不被notify不會出來,但這個線程在等待100毫秒後會自動進入就緒隊列等待系統分配資源,換句話說,sleep(100)在100毫秒後確定會運行,但wait在100毫秒後還有等待os調用分配資源,因此wait100的中止運行時間是不肯定的,但至少是100毫秒。get

就是說sleep有時間限制的就像鬧鐘同樣到時候就叫了,而wait是無限期的除非用戶主動notify同步

三、使用範圍不一樣

wait,notify和notifyAll只能在同步控制方法或者同步控制塊裏面使用,而sleep能夠在任何地方使用

synchronized(x){
x.notify()
//或者wait()
}

四、是否須要捕獲異常

sleep必須捕獲異常,而wait,notify和notifyAll不須要捕獲異常。

本文地址:https://www.linuxprobe.com/sleep-wait.html

相關文章
相關標籤/搜索