Thread.sleep and Thread.yield

簡(jiǎn)書(shū) 占小狼
轉(zhuǎn)載請(qǐng)注明原創(chuàng)出處,謝謝!

前言

在日常的開(kāi)發(fā)過(guò)程中,我們通過(guò)會(huì)使用Thread.sleep模擬一個(gè)耗時(shí)的任務(wù)執(zhí)行過(guò)程。

線(xiàn)程sleep或yield之后發(fā)生了什么?在深入細(xì)節(jié)之前,先看看線(xiàn)程的基本概念。

線(xiàn)程概念

線(xiàn)程是操作系統(tǒng)執(zhí)行任務(wù)的基本單位,處理器的數(shù)量決定了不可能所有的線(xiàn)程同時(shí)得到運(yùn)行,這就意味著需要通過(guò)某種算法,如window下的搶占式,進(jìn)行線(xiàn)程的調(diào)度。


Paste_Image.png

一個(gè)線(xiàn)程從開(kāi)始到結(jié)束可能會(huì)有上述幾種狀態(tài),之間可以互相轉(zhuǎn)換。

Thread.sleep

Sleep意味著線(xiàn)程主動(dòng)告訴操作系統(tǒng)自己要休息 n 毫秒。

  1. Thread.sleep(0) 進(jìn)入就緒狀態(tài)
    如果n=0時(shí),意味著當(dāng)前線(xiàn)程的時(shí)間片沒(méi)有用完,主動(dòng)放棄自己剩下的時(shí)間片,進(jìn)入就緒狀態(tài)。這種情況下只能調(diào)度優(yōu)先級(jí)相等或更高的線(xiàn)程,意味著優(yōu)先級(jí)低的線(xiàn)程很難獲得時(shí)間片,很可能永遠(yuǎn)都調(diào)用不到。當(dāng)沒(méi)有符合條件的線(xiàn)程,會(huì)一直占用 CPU 時(shí)間片,造成 CPU 100%占用率。
  2. Thread.sleep(1) 進(jìn)入阻塞狀態(tài)
    如果n>0,會(huì)強(qiáng)制當(dāng)前線(xiàn)程放棄剩余時(shí)間片,并休息n秒(因?yàn)椴皇菍?shí)時(shí)操作系統(tǒng),時(shí)間無(wú)法保證精確,一般可能會(huì)滯后幾毫秒或一個(gè)時(shí)間片),進(jìn)入阻塞狀態(tài)。這種情況下所有其它就緒狀態(tài)的線(xiàn)程都有機(jī)會(huì)競(jìng)爭(zhēng)時(shí)間片,而不用在乎優(yōu)先級(jí)。無(wú)論有沒(méi)有符合的線(xiàn)程,都會(huì)放棄 CPU 時(shí)間,因此 CPU 占用率較低。

Thread.yield

Yield 的中文翻譯為 “讓步,讓位”,這里意思是當(dāng)前線(xiàn)程主動(dòng)讓出時(shí)間片,并讓操作系統(tǒng)調(diào)度其它就緒態(tài)的線(xiàn)程使用時(shí)間片。

  • 如果調(diào)用 Yield,只是把當(dāng)前線(xiàn)程放入到就緒隊(duì)列中,而不是阻塞隊(duì)列
  • 如果沒(méi)有找到其它就緒態(tài)的線(xiàn)程,則當(dāng)前線(xiàn)程繼續(xù)運(yùn)行
  • 比 Thread.Sleep(0) 速度要快,可以讓低于當(dāng)前優(yōu)先級(jí)的線(xiàn)程得以運(yùn)行

END。
我是占小狼。
在魔都艱苦奮斗,白天是上班族,晚上是知識(shí)服務(wù)工作者。
讀完我的文章有收獲,記得關(guān)注和點(diǎn)贊哦,如果非要打賞,我也是不會(huì)拒絕的啦!

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

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

  • 該文章轉(zhuǎn)自:http://blog.csdn.net/evankaka/article/details/44153...
    加來(lái)依藍(lán)閱讀 7,472評(píng)論 3 87
  • 寫(xiě)在前面的話(huà): 這篇博客是我從這里“轉(zhuǎn)載”的,為什么轉(zhuǎn)載兩個(gè)字加“”呢?因?yàn)檫@絕不是簡(jiǎn)單的復(fù)制粘貼,我花了五六個(gè)小...
    SmartSean閱讀 4,965評(píng)論 12 45
  • 本文主要講了java中多線(xiàn)程的使用方法、線(xiàn)程同步、線(xiàn)程數(shù)據(jù)傳遞、線(xiàn)程狀態(tài)及相應(yīng)的一些線(xiàn)程函數(shù)用法、概述等。 首先講...
    李欣陽(yáng)閱讀 2,602評(píng)論 1 15
  • 前言 多線(xiàn)程并發(fā)編程是Java編程中重要的一塊內(nèi)容,也是面試重點(diǎn)覆蓋區(qū)域,所以學(xué)好多線(xiàn)程并發(fā)編程對(duì)我們來(lái)說(shuō)極其重要...
    嘟爺MD閱讀 7,425評(píng)論 21 272
  • 這是一篇寫(xiě)于2016年的文章。寫(xiě)于畢業(yè)之前,寫(xiě)于未知之前。 交朋友這件事情我從來(lái)都不勉強(qiáng)自己,合得來(lái)就做朋友,合不...
    陌柔桑閱讀 360評(píng)論 0 0

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