sleep(),wait(),yield(),join()方法的區(qū)別

轉(zhuǎn)載:http://blog.csdn.net/xiangwanpeng/article/details/54972952

1、sleep()

Thread.sleep(1000);

sleep()方法是Thread類(lèi)的靜態(tài)方法,也是native方法。
sleep()方法需要捕獲InterruptedException異常。
不會(huì)釋放“鎖標(biāo)志”。

sleep()方法需要指定等待的時(shí)間,它可以讓當(dāng)前正在執(zhí)行的線程在指定的時(shí)間內(nèi)暫停執(zhí)行,進(jìn)入阻塞狀態(tài),該方法既可以讓其他同優(yōu)先級(jí)或者高優(yōu)先級(jí)的線程得到執(zhí)行的機(jī)會(huì),也可以讓低優(yōu)先級(jí)的線程得到執(zhí)行機(jī)會(huì)。但是sleep()方法不會(huì)釋放“鎖標(biāo)志”,也就是說(shuō)如果有synchronized同步快,其他線程仍然不能訪問(wèn)共享數(shù)據(jù)。

2、wait()

對(duì)象的方法。
會(huì)釋放對(duì)象的“鎖標(biāo)志”。

wait()方法需要和notify()及notifyAll()兩個(gè)方法一起介紹,這三個(gè)方法用于協(xié)調(diào)多個(gè)線程對(duì)共享數(shù)據(jù)的存取,所以必須在synchronized語(yǔ)句塊內(nèi)使用,也就是說(shuō),調(diào)用wait(),notify()和notifyAll()的任務(wù)在調(diào)用這些方法前必須擁有對(duì)象的鎖。注意,它們都是Object類(lèi)的方法,而不是Thread類(lèi)的方法。

wait()方法與sleep()方法的不同之處在于,wait()方法會(huì)釋放對(duì)象的“鎖標(biāo)志”。當(dāng)調(diào)用某一對(duì)象的wait()方法后,會(huì)使當(dāng)前線程暫停執(zhí)行,并將當(dāng)前線程放入對(duì)象等待池中,直到調(diào)用了notify()方法后,將從對(duì)象等待池中移出任意一個(gè)線程并放入鎖標(biāo)志等待池中,只有鎖標(biāo)志等待池中的線程可以獲取鎖標(biāo)志,它們隨時(shí)準(zhǔn)備爭(zhēng)奪鎖的擁有權(quán)。當(dāng)調(diào)用了某個(gè)對(duì)象的notifyAll()方法,會(huì)將對(duì)象等待池中的所有線程都移動(dòng)到該對(duì)象的鎖標(biāo)志等待池。

除了使用notify()和notifyAll()方法,還可以使用帶毫秒?yún)?shù)的wait(long timeout)方法,效果是在延遲timeout毫秒后,被暫停的線程將被恢復(fù)到鎖標(biāo)志等待池。

此外,wait(),notify()及notifyAll()只能在synchronized語(yǔ)句中使用,但是如果使用的是ReenTrantLock實(shí)現(xiàn)同步,該如何達(dá)到這三個(gè)方法的效果呢?解決方法是使用ReenTrantLock.newCondition()獲取一個(gè)Condition類(lèi)對(duì)象,然后Condition的await(),signal()以及signalAll()分別對(duì)應(yīng)上面的三個(gè)方法。

3、yield()

Thread類(lèi)的靜態(tài)方法。
不會(huì)釋放“鎖標(biāo)志”。
不拋異常。

yield()方法和sleep()方法類(lèi)似,也不會(huì)釋放“鎖標(biāo)志”,它是Thread類(lèi)的靜態(tài)方法。區(qū)別在于,它沒(méi)有參數(shù),即yield()方法只是使當(dāng)前線程“讓步”,重新回到可執(zhí)行狀態(tài)(就緒狀態(tài)Runnable),所以執(zhí)行yield()的線程有可能在進(jìn)入到可執(zhí)行狀態(tài)后馬上又被執(zhí)行,另外yield()方法只能使同優(yōu)先級(jí)或者高優(yōu)先級(jí)的線程得到執(zhí)行機(jī)會(huì),這也和sleep()方法不同。

4、join()

Thread類(lèi)的對(duì)象實(shí)例的方法。
Thread t1 = new Thread();
t1.join();

它是Thread類(lèi)的對(duì)象實(shí)例的方法。join()方法會(huì)使當(dāng)前線程等待調(diào)用join()方法的線程結(jié)束后才能繼續(xù)執(zhí)行。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文主要講了java中多線程的使用方法、線程同步、線程數(shù)據(jù)傳遞、線程狀態(tài)及相應(yīng)的一些線程函數(shù)用法、概述等。 首先講...
    李欣陽(yáng)閱讀 2,600評(píng)論 1 15
  • 1.解決信號(hào)量丟失和假喚醒 public class MyWaitNotify3{ MonitorObject m...
    Q羅閱讀 1,015評(píng)論 0 1
  • 線程在一定條件下,狀態(tài)會(huì)發(fā)生變化。線程一共有以下幾種狀態(tài): 1、新建狀態(tài)(New):新創(chuàng)建了一個(gè)線程對(duì)象。 2、就...
    godhong閱讀 2,517評(píng)論 0 0
  • 安裝Docker 本來(lái)打算在CentOS6上安裝Docker,最終由于CentOS6上自帶的kernel版本太低導(dǎo)...
    GoGooGooo閱讀 27,478評(píng)論 4 4
  • 2017年7月9日 星期日 晴 【早起】06:00 【睡覺(jué)】22:00 【鍛煉】無(wú) 【學(xué)習(xí)】無(wú) 【心賞日記...
    真泥閱讀 1,011評(píng)論 0 0

友情鏈接更多精彩內(nèi)容