閱讀244 返回首頁    go 阿裏雲 go 技術社區[雲棲]


sleep與wait的區別

1、來自不同的類

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

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


2、有沒有釋放鎖(釋放資源)

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

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毫秒。

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


3、使用範圍不同

wait,notify和notifyAll隻能在同步控製方法或者同步控製塊裏麵使用,而sleep可以在任何地方使用
   synchronized(x){
      x.notify()
     //或者wait()
   }


4、是否需要捕獲異常

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


最後更新:2017-04-02 22:15:49

  上一篇:go 近期計劃
  下一篇:go 多線程編程 -wait(),notify()/notityAll()方法