學(xué)習(xí)完整課程請(qǐng)移步 互聯(lián)網(wǎng) Java 全棧工程師
sleep()
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ù)图焰。
wait()
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è)方法。
yield()
yield()
方法和 sleep()
方法類(lèi)似责球,也不會(huì)釋放“鎖標(biāo)志”,區(qū)別在于拓劝,它沒(méi)有參數(shù)雏逾,即 yield()
方法只是使當(dāng)前線程重新回到可執(zhí)行狀態(tài),所以執(zhí)行 yield()
的線程有可能在進(jìn)入到可執(zhí)行狀態(tài)后馬上又被執(zhí)行郑临,另外 yield()
方法只能使同優(yōu)先級(jí)或者高優(yōu)先級(jí)的線程得到執(zhí)行機(jī)會(huì)栖博,這也和 sleep()
方法不同。
join()
join()
方法會(huì)使當(dāng)前線程等待調(diào)用 join()
方法的線程結(jié)束后才能繼續(xù)執(zhí)行