wait()和sleep()
sleep()
使讓線程睡眠一定的時間,不釋放任何鎖,但是它過了睡眠時間后,不一定能獲得執行的時間!最終的調度是由CPU決定的!Thread.sleep() 是可以從任何上下文調用的靜態方法。Thread.sleep() 暫停當前線程
wait()
是一個用于線程同步的實例方法。它可以在任何對象上調用,因為它定義在 java.lang.Object 上, 但只能從同步塊中調用。它釋放對象上的鎖,以便另一個線程可以跳入并獲取鎖。wait 從字面上來理解的話,它具有等待的意思。它等待?notify 或 notifyAll 對其喚醒!如果直接調用 wait 會拋出 java.lang.IllegalMonitorStateException 異常,原因是還沒有得到對象鎖,所以無法釋放鎖。
sleep 與 wait 的區別
-
sleep()線程控制自身流程。
-
wait()用來線程間通信,使擁有該對象鎖的線程等待直到指定時間或notify()
-
wait()會釋放鎖和監視器,sleep()不釋放任何鎖或監視器等
-
wait()用于線程間通信,而sleep()用于在執行時引入暫停
-
適用區域,wait只能放在同步語句塊中才有意義
-
sleep來自Thread類,和wait來自Object類
-
sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常
-
sleep是Thread的靜態類方法,誰調用的誰去睡覺,即使在a線程里調用了b的sleep方法,實際上還是a去睡覺,要讓b線程睡覺要在b的代碼中調用sleep
-
Thread.Sleep(0)的作用是“觸發操作系統立刻重新進行一次CPU競爭”
-
wait方法一旦過了超時時間,并不需要其他線程執行notify也能自動解除阻塞,但是如果沒設置超時時間的wait方法必須等待其他線程執行notify
總結
以上是生活随笔為你收集整理的wait()和sleep()的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HashMap 1.7 死循环过程
- 下一篇: 同步规则和happen-before规则