???在操作系統(tǒng)中,線程有等待、就緒和運行這幾種狀態(tài),等待隊列中的線程是不會參與到CPU的競爭,只有就緒隊列中的線程會參與到CPU的競爭,對應的在Java中的線程有6種狀態(tài):new、ready、running、waiting、timeWaiting和terminated這6中狀態(tài)。
???在Java的Thread類中有sleep方法,這個方法的調(diào)用會出讓當前執(zhí)行線程的CPU時間片持有當前線程持有的鎖資源不釋放,并且進入到等待隊列中,待sleep時間到了,該線程才會進入到就緒隊列參與到CPU時間片的競爭。sleep(0)是為了讓當前線程讓出CPU執(zhí)行時間,讓操作系統(tǒng)執(zhí)行一次CPU調(diào)度,這個CPU調(diào)度會根據(jù)相應的CPU調(diào)度算法(優(yōu)先級啥的)重新計算調(diào)度一個線程執(zhí)行,sleep(0)當前線程不會進入到等待隊列中,是進入到就緒隊列中,也參與到CPU的競爭,所以有可能會立即拿到CPU時間片。
???sleep(0)和yeild的區(qū)別:兩者都是出讓當前CPU,進入到就緒隊列中,都有可能立即被分配到CPU時間片。
???Thread.sleep在JVM中的實現(xiàn)
if (millis == 0) {
// When ConvertSleepToYield is on, this matches the classic VM implementation of
// JVM_Sleep. Critical for similar threading behaviour (Win32)
// It appears that in certain GUI contexts, it may be beneficial to do a short sleep
// for SOLARIS
if (ConvertSleepToYield) {
os::yield();
} else {
ThreadState old_state = thread->osthread()->get_state();
thread->osthread()->set_state(SLEEPING);
os::sleep(thread, MinSleepInterval, false);
thread->osthread()->set_state(old_state);
}
}
???Thread.yeild在JVM中的實現(xiàn):
if (ConvertYieldToSleep) {
os::sleep(thread, MinSleepInterval, false);
} else {
os::yield();
}