sleep0的思考

???在操作系統(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();
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容