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