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