sleep( ) 和 wait( ) 的这 5 个区别,你知道几个
轉(zhuǎn)載自??sleep( ) 和 wait( ) 的這 5 個(gè)區(qū)別,你知道幾個(gè)
sleep(休眠) 和 wait(等待) 方法是 Java 多線程中常用的兩個(gè)方法,它們有什么區(qū)別及一些該注意的地方有哪些呢?下面給大家一一分解。
區(qū)別1:使用限制
使用 sleep 方法可以讓讓當(dāng)前線程休眠,時(shí)間一到當(dāng)前線程繼續(xù)往下執(zhí)行,在任何地方都能使用,但需要捕獲 InterruptedException 異常。
try?{Thread.sleep(3000L); }?catch?(InterruptedException?e)?{e.printStackTrace(); }而使用 wait 方法則必須放在 synchronized 塊里面,同樣需要捕獲 InterruptedException 異常,并且需要獲取對(duì)象的鎖。
synchronized?(lock){try?{lock.wait();}?catch?(InterruptedException?e)?{e.printStackTrace();} }而且 wait 還需要額外的方法 notify/ notifyAll 進(jìn)行喚醒,它們同樣需要放在 synchronized 塊里面,且獲取對(duì)象的鎖。。
synchronized?(lock)?{//?隨機(jī)喚醒lock.notify();//?喚醒全部lock.notifyAll(); }當(dāng)然也可以使用帶時(shí)間的 wait(long millis) 方法,時(shí)間一到,無(wú)需其他線程喚醒,也會(huì)重新競(jìng)爭(zhēng)獲取對(duì)象的鎖繼續(xù)執(zhí)行。
區(qū)別2:使用場(chǎng)景
sleep 一般用于當(dāng)前線程休眠,或者輪循暫停操作,wait 則多用于多線程之間的通信。
區(qū)別3:所屬類
sleep 是 Thread 類的靜態(tài)本地方法,wait 則是 Object 類的本地方法。
java.lang.Thread#sleep
public?static?native?void?sleep(long?millis)?throws?InterruptedException;java.lang.Object#wait
public?final?native?void?wait(long?timeout)?throws?InterruptedException;為什么要這樣設(shè)計(jì)呢?
因?yàn)?sleep 是讓當(dāng)前線程休眠,不涉及到對(duì)象類,也不需要獲得對(duì)象的鎖,所以是線程類的方法。wait 是讓獲得對(duì)象鎖的線程實(shí)現(xiàn)等待,前提是要楚獲得對(duì)象的鎖,所以是類的方法。
區(qū)別4:釋放鎖
Object?lock?=?new?Object(); synchronized?(lock)?{try?{lock.wait(3000L);Thread.sleep(2000L);}?catch?(InterruptedException?e)?{e.printStackTrace();} }如上代碼所示,wait 可以釋放當(dāng)前線程對(duì) lock 對(duì)象鎖的持有,而 sleep 則不會(huì)。
區(qū)別5:線程切換
sleep 會(huì)讓出 CPU 執(zhí)行時(shí)間且強(qiáng)制上下文切換,而 wait 則不一定,wait 后可能還是有機(jī)會(huì)重新競(jìng)爭(zhēng)到鎖繼續(xù)執(zhí)行的。
總結(jié)
以上是生活随笔為你收集整理的sleep( ) 和 wait( ) 的这 5 个区别,你知道几个的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux中目录文件(linux下目录)
- 下一篇: 一文告诉你如何导出 Git 变更文件