轉(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í)行。