Java中的yield和sleep函數(shù)是常用的線程控制函數(shù),它們可以幫助我們控制線程的執(zhí)行方式和時(shí)間,以下是它們的詳細(xì)介紹:
public static void yield()
這個(gè)函數(shù)可以讓當(dāng)前執(zhí)行的線程讓出CPU資源,讓其他線程有機(jī)會(huì)執(zhí)行。yield()方法不能保證當(dāng)前線程會(huì)被掛起,因?yàn)镃PU資源的分配是有操作系統(tǒng)決定的。但是,它可以提高多線程程序的效率,避免占用CPU資源過多。
public static void sleep(long millis)
這個(gè)函數(shù)可以暫停當(dāng)前線程的執(zhí)行,讓其他線程有機(jī)會(huì)執(zhí)行。sleep()方法會(huì)讓當(dāng)前線程進(jìn)入阻塞狀態(tài),進(jìn)入該狀態(tài)的線程會(huì)立即釋放CPU資源,給其他線程機(jī)會(huì)。當(dāng)指定的時(shí)間到達(dá)后,線程會(huì)被喚醒并開始繼續(xù)執(zhí)行。該方法要注意當(dāng)休眠時(shí)間過長時(shí),可能會(huì)出現(xiàn)需求不符合預(yù)期情況。
除了上述不同之外,yield和sleep還有其他的區(qū)別。主要從以下兩個(gè)方面進(jìn)行分析:
1.調(diào)用方法的執(zhí)行時(shí)間不同
yield()方法通常情況下以很快的速度結(jié)束執(zhí)行,并且在結(jié)束前不會(huì)釋放鎖。而sleep()方法則不同,它需要等待一個(gè)固定的時(shí)間,然后線程便自動(dòng)取消阻塞,繼續(xù)執(zhí)行。在這個(gè)過程中,線程所持有的鎖都不會(huì)被釋放。
2.產(chǎn)生的影響不同
yield()方法經(jīng)常用于并發(fā)程序中,幫助他們更好的運(yùn)行。調(diào)用yield()方法會(huì)讓線程放棄當(dāng)前的CPU資源,進(jìn)入到可運(yùn)行狀態(tài),然后讓其他的線程運(yùn)行。自己也有可能在重新調(diào)度后再次被執(zhí)行到。 如果說CPU支持超級線程技術(shù)(一般都支持),則 yield()方法只會(huì)讓同等優(yōu)先級的線程得到執(zhí)行的機(jī)會(huì)。
sleep()方法則廣泛地用于繁重或復(fù)雜的計(jì)算機(jī)操作上,或調(diào)試某些程序時(shí)使用。在這些領(lǐng)域,應(yīng)用程序往往需要等待另一個(gè)任務(wù)或一段時(shí)間后才能繼續(xù),此時(shí)調(diào)用sleep()方法。注意,使用sleep()方法有可能使線程無限期地被掛起,只有等到另一個(gè)線程執(zhí)行喚醒該線程才能繼續(xù)執(zhí)行。