一区二区三区电影_国产伦精品一区二区三区视频免费_亚洲欧美国产精品va在线观看_国产精品一二三四

聯(lián)系我們 - 廣告服務(wù) - 聯(lián)系電話(huà):
您的當(dāng)前位置: > 關(guān)注 > > 正文

為什么用Thread.Sleep函數(shù)把線(xiàn)程掛起時(shí)間?關(guān)于Thread.sleep的兩個(gè)問(wèn)題

來(lái)源:CSDN 時(shí)間:2023-03-06 08:04:45

我們可能經(jīng)常會(huì)用到 Thread.Sleep 函數(shù)把線(xiàn)程掛起一段時(shí)間。那么你有沒(méi)有正確的理解這個(gè)函數(shù)的用法呢?

思考下面這兩個(gè)問(wèn)題:

問(wèn)題一:


(資料圖片僅供參考)

假設(shè)現(xiàn)在是 2008-4-7 12:00:00.000,如果我調(diào)用一下 Thread.Sleep(1000) ,在 2008-4-7 12:00:01.000 的時(shí)候,這個(gè)線(xiàn)程會(huì)不會(huì)被喚醒?

問(wèn)題二:

某人的代碼中用了一句看似莫明其妙的話(huà):Thread.Sleep(0) 。既然是 Sleep 0 毫秒,那么他跟去掉這句代碼相比,有啥區(qū)別么?

先回顧一下系統(tǒng)原理:

操作系統(tǒng)中,CPU競(jìng)爭(zhēng)有很多種策略。Unix系統(tǒng)使用的是時(shí)間片算法,而Windows則屬于搶占式的。

在時(shí)間片算法中,所有的進(jìn)程排成一個(gè)隊(duì)列。操作系統(tǒng)按照他們的順序,給每個(gè)進(jìn)程分配一段時(shí)間,即該進(jìn)程允許運(yùn)行的時(shí)間。如果在時(shí)間片結(jié)束時(shí)進(jìn)程還在運(yùn)行,則CPU將被剝奪并分配給另一個(gè)進(jìn)程。如果進(jìn)程在時(shí)間片結(jié)束前阻塞或結(jié)束,則CPU當(dāng)即進(jìn)行切換。調(diào)度程 序所要做的就是維護(hù)一張就緒進(jìn)程列表,當(dāng)進(jìn)程用完它的時(shí)間片后,它被移到隊(duì)列的末尾。

所謂搶占式操作系統(tǒng),就是說(shuō)如果一個(gè)進(jìn)程得到了 CPU 時(shí)間,除非它自己放棄使用 CPU ,否則將完全霸占 CPU 。因此可以看出,在搶 占式操作系統(tǒng)中,操作系統(tǒng)假設(shè)所有的進(jìn)程都是“人品很好”的,會(huì)主動(dòng)退出 CPU 。

在搶占式操作系統(tǒng)中,假設(shè)有若干進(jìn)程,操作系統(tǒng)會(huì)根據(jù)他們的優(yōu)先級(jí)、饑餓時(shí)間(已經(jīng)多長(zhǎng)時(shí)間沒(méi)有使用過(guò) CPU 了),給他們算出一 個(gè)總的優(yōu)先級(jí)來(lái)。操作系統(tǒng)就會(huì)把 CPU 交給總優(yōu)先級(jí)最高的這個(gè)進(jìn)程。當(dāng)進(jìn)程執(zhí)行完畢或者自己主動(dòng)掛起后,操作系統(tǒng)就會(huì)重新計(jì)算一 次所有進(jìn)程的總優(yōu)先級(jí),然后再挑一個(gè)優(yōu)先級(jí)最高的把 CPU 控制權(quán)交給他。

回答第一個(gè)問(wèn)題:

對(duì)于第一個(gè)問(wèn)題,答案是:不一定。因?yàn)槟阒皇歉嬖V操作系統(tǒng):在未來(lái)的1000毫秒內(nèi)我不想再參與到CPU競(jìng)爭(zhēng)。那么1000毫秒過(guò)去之后,這時(shí)候也許另外一個(gè)線(xiàn)程正在使用CPU,那么這時(shí)候操作系統(tǒng)是不會(huì)重新分配CPU的,直到那個(gè)線(xiàn)程掛起或結(jié)束;況且,即使這個(gè)時(shí)候恰巧輪到操作系統(tǒng)進(jìn)行CPU 分配,那么當(dāng)前線(xiàn)程也不一定就是總優(yōu)先級(jí)最高的那個(gè),CPU還是可能被其他線(xiàn)程搶占去。

與此相似的,Thread有個(gè)Resume函數(shù),是用來(lái)喚醒掛起的線(xiàn)程的。好像上面所說(shuō)的一樣,這個(gè)函數(shù)只是“告訴操作系統(tǒng)我從現(xiàn)在起開(kāi)始參與CPU競(jìng)爭(zhēng)了”,這個(gè)函數(shù)的調(diào)用并不能馬上使得這個(gè)線(xiàn)程獲得CPU控制權(quán)。

回答第二個(gè)問(wèn)題:

對(duì)于第二個(gè)問(wèn)題,答案是:有,而且區(qū)別很明顯。Thread.Sleep(0)的作用,就是“觸發(fā)操作系統(tǒng)立刻重新進(jìn)行一次CPU競(jìng)爭(zhēng)”。競(jìng)爭(zhēng)的結(jié)果也許是當(dāng)前線(xiàn)程仍然獲得CPU控制權(quán),也許會(huì)換成別的線(xiàn)程獲得CPU控制權(quán)。這也是我們?cè)诖笱h(huán)里面經(jīng)常會(huì)寫(xiě)一句Thread.Sleep(0) ,因?yàn)檫@樣就給了其他線(xiàn)程比如Paint線(xiàn)程獲得CPU控制權(quán)的權(quán)力,這樣界面就不會(huì)假死在那里。

責(zé)任編輯:

標(biāo)簽: 操作系統(tǒng)

精彩放送:

新聞聚焦

關(guān)于我們 | 聯(lián)系我們 | 投稿合作 | 法律聲明 | 廣告投放

版權(quán)所有©2017-2020   太陽(yáng)信息網(wǎng)京ICP備2021034106號(hào)-55

所載文章、數(shù)據(jù)僅供參考,使用前務(wù)請(qǐng)仔細(xì)閱讀網(wǎng)站聲明。本站不作任何非法律允許范圍內(nèi)服務(wù)!

聯(lián)系我們:55 16 53 8 @qq.com

Top 主站蜘蛛池模板: 萍乡市| 方正县| 奉贤区| 英德市| 太白县| 宝山区| 治县。| 施甸县| 台湾省| 阆中市| 陈巴尔虎旗| 潜山县| 巴林左旗| 千阳县| 西吉县| 通化县| 玛曲县| 西充县| 浦江县| 高清| 安顺市| 淮滨县| 贺兰县| 福贡县| 苏尼特右旗| 西畴县| 南京市| 大邑县| 吴桥县| 遵义县| 哈密市| 额尔古纳市| 宁德市| 汝城县| 健康| 麻江县| 郁南县| 天峻县| 策勒县| 曲松县| 博罗县|