0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Thread.sleep(0)到底是個(gè)什么騷操作?

Android編程精選 ? 來(lái)源:CSDN ? 2023-01-03 11:19 ? 次閱讀

今天看到一段有意思的代碼:Thread.sleep(0),下面就來(lái)分析一下這串看似無(wú)用的代碼到底有沒(méi)有用。

Thread.sleep(0)到底是個(gè)什么騷操作,這睡0毫秒和不睡有什么區(qū)別嗎?

操作系統(tǒng)資源的分配策略

想要去了解多線程,就先要去了解操作系統(tǒng)中資源的不同分配策略在操作系統(tǒng)中,CPU資源的分配策略有多種,下面就拿兩種最為典型的策略舉例:

時(shí)間片算法

基于時(shí)間片算法分配資源的代表就是Unix系統(tǒng)。在時(shí)間片算法中,操作系統(tǒng)會(huì)維護(hù)一個(gè)隊(duì)列,將所有的進(jìn)程放入隊(duì)列中。然后操作系統(tǒng)會(huì)按照隊(duì)列中的進(jìn)程順序?yàn)樗麄兎峙鋵儆谧约旱倪\(yùn)行時(shí)間,也就是說(shuō),操作系統(tǒng)給A進(jìn)程分配n毫秒時(shí)間,那么A進(jìn)程在本次排隊(duì)時(shí)只可以運(yùn)行n毫秒。

當(dāng)A進(jìn)程運(yùn)行完n毫秒后,操作系統(tǒng)不管A是否運(yùn)行完畢都會(huì)把運(yùn)行權(quán)限強(qiáng)行剝奪,交給隊(duì)列里面的下一個(gè)進(jìn)程去執(zhí)行,然后A進(jìn)程繼續(xù)去隊(duì)列尾部進(jìn)行下一次排隊(duì)。(這里,如果A在n毫秒之前提前結(jié)束或者被阻塞,操作系統(tǒng)會(huì)立即收回A的運(yùn)行權(quán)限)

舉個(gè)例子:

你去食堂買飯,這種模式就是食堂會(huì)強(qiáng)制你去排隊(duì),而且每人只有十分鐘點(diǎn)餐時(shí)間,一旦過(guò)了這個(gè)時(shí)間你就要重新去排隊(duì)。

搶占式

基于搶占式分配資源的代表是Winodws系統(tǒng)。搶占式的操作系統(tǒng)都是“儒家學(xué)派”的,默認(rèn)每個(gè)進(jìn)程都是“君子”。意思就是:一個(gè)進(jìn)程一旦拿到CPU后,除非它主動(dòng)放棄CPU權(quán)限,不然別的進(jìn)程是拿不到CPU權(quán)限的。

然后操作系統(tǒng)在選取執(zhí)行權(quán)限的時(shí)候也不是隨機(jī)選的,它會(huì)根據(jù)優(yōu)先級(jí)和饑餓時(shí)間來(lái)判定誰(shuí)更需要CPU權(quán)限的。每次一個(gè)進(jìn)程是釋放CPU后,就會(huì)進(jìn)行一次優(yōu)先級(jí)評(píng)定。也就是說(shuō),如果運(yùn)氣好,每次都會(huì)被選中。

舉個(gè)例子:

你去食堂買飯,食堂阿姨看你小伙子挺帥就先給你盛飯。然后給你盛完飯?jiān)龠x一次,又發(fā)現(xiàn)你這小伙子越看越順眼,就再給你一碗。

關(guān)于Sleep

拿搶占式來(lái)說(shuō)。去食堂吃飯,阿姨看小伙子挺不錯(cuò),三番五次的給你盛飯,但是你已經(jīng)吃飽了,這時(shí)候你就會(huì)告訴阿姨我吃飽了,接下來(lái)半小時(shí)不要再給我盛飯了。

對(duì)應(yīng)到代碼里就是,A最近30min不想再參與資源選舉了,這時(shí)它就會(huì)sleep(30 * 60 * 1000),然后操作系統(tǒng)就會(huì)進(jìn)行再次選舉,并且未來(lái)半小時(shí)A不參與選舉。此時(shí)當(dāng)A醒來(lái)之后,或許CPU執(zhí)行權(quán)在另一個(gè)進(jìn)程手里。

再說(shuō)Thread.sleep(0)

假如A執(zhí)行了一段時(shí)間后,突然想起來(lái)其他小伙伴可能也需要CPU執(zhí)行權(quán)限,不能光自己一個(gè)人霸占這個(gè)CPU,但是又沒(méi)辦法主動(dòng)申請(qǐng)?jiān)俅芜x舉,就只能退而求其次執(zhí)行Thread.sleep(0),在A有執(zhí)行權(quán)限的情況下執(zhí)行,執(zhí)行后告訴操作系統(tǒng),我要休息0毫秒,你接下來(lái)0毫秒內(nèi)的選舉就不要選我啦。但是操作系統(tǒng)下次再選舉的時(shí)候還是會(huì)把A算進(jìn)去,因?yàn)?毫秒已經(jīng)過(guò)了。

總結(jié)

Thread.sleep(0)不光有用,而且有奇效,對(duì)于想做老好人的進(jìn)程可以調(diào)用一次,讓操作系統(tǒng)再次進(jìn)行選舉。

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4627

    瀏覽量

    93168
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6875

    瀏覽量

    123577
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4819

    瀏覽量

    68879

原文標(biāo)題:Thread.sleep(0)到底是個(gè)什么騷操作?

文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    ADS7864采樣頻率到底是由外部時(shí)鐘決定還是HOLDX信號(hào)頻率決定?

    ADS7864數(shù)據(jù)手冊(cè)上說(shuō)當(dāng)采用8M外部時(shí)鐘的時(shí)候,采樣頻率為500kHz,但是有人說(shuō)可以通過(guò)HOLDX頻率來(lái)控制采樣頻率,一個(gè)HOLDX下降沿采樣一次,HOLDX頻率就是采樣頻率。請(qǐng)問(wèn)采樣頻率到底是由外部時(shí)鐘決定還是HOLDX信號(hào)頻率決定?
    發(fā)表于 01-14 06:47

    DAC3283到底是8位的LVDS輸入數(shù)據(jù)還是16位的LVDS輸入數(shù)據(jù)?

    請(qǐng)問(wèn)這個(gè)DAC到底是8位的LVDS輸入數(shù)據(jù)還是16位的LVDS輸入數(shù)據(jù)啊。。也就是說(shuō),這個(gè)I路的15:8和7:0,是一個(gè)16位數(shù)據(jù)拆成了兩部分,高八位和第八位(其中又包含P和N),還是一個(gè)
    發(fā)表于 12-31 08:27

    DAC3283的轉(zhuǎn)換函數(shù)到底是怎樣的?是不是用16bit的數(shù)據(jù)來(lái)量化參考電流?

    問(wèn)一個(gè)基礎(chǔ)但是沒(méi)搞懂的問(wèn)題,看了數(shù)據(jù)手冊(cè),一頭霧水 對(duì)于輸入的16bit的I和Q數(shù)據(jù)信號(hào),一直令Q為0 在時(shí)鐘驅(qū)動(dòng)下,將I由全0個(gè)個(gè)加到全1,但是并沒(méi)有輸出一
    發(fā)表于 12-09 06:12

    TLV320AIC3254內(nèi)部中的ADC處理模塊和minidsp到底是什么關(guān)系?

    我想請(qǐng)問(wèn)一下幾個(gè)問(wèn)題: 1.3254內(nèi)部中的ADC處理模塊和minidsp到底是什么關(guān)系,是并列的還是串行關(guān)系?還是ADC處理模塊就是minidsp特殊情況下的部分? 2.minidsp的抽取因子該怎么理解,到底怎么使用?
    發(fā)表于 10-31 06:02

    請(qǐng)問(wèn)PCM2903C的溫度范圍到底是多少呢?

    如下圖,PCM2903C的溫度范圍到底是多少呢? 如果用在-25~85℃,是否會(huì)出問(wèn)題?
    發(fā)表于 10-14 07:14

    放大器的共模輸入電壓到底是指什么?

    請(qǐng)問(wèn)放大器的共模輸入電壓到底是指什么?
    發(fā)表于 09-19 07:17

    功放和運(yùn)放到底是什么區(qū)別?

    想請(qǐng)問(wèn)一下功放和運(yùn)放到底是什么區(qū)別,感覺(jué)只要接一個(gè)小負(fù)載,運(yùn)放的輸出電流也可以很大啊?到底有什么區(qū)別啊
    發(fā)表于 09-10 07:00

    請(qǐng)問(wèn)LMV772到底是雙電源還是單電源?。?/a>

    請(qǐng)問(wèn)LMV772到底是雙電源還是單電源?。渴謨?cè)前面寫(xiě)的太模糊了。求指教
    發(fā)表于 09-09 07:10

    運(yùn)放的輸入電容到底是什么?

    我想請(qǐng)問(wèn)一下運(yùn)放的輸入電容到底是什么?
    發(fā)表于 09-04 06:52

    LMH6502的輸入電壓到底是多少?

    LMH6502的輸入電壓到底是多少,我稍微給如大一點(diǎn)點(diǎn)的信號(hào),放大不行還能接受,我衰減都失真,
    發(fā)表于 08-27 07:02

    對(duì)于STM8的固件庫(kù),到底是怎么對(duì)文件進(jìn)行配置的?

    對(duì)于STM8的固件庫(kù),到底是怎么對(duì)文件進(jìn)行配置的?
    發(fā)表于 05-17 15:59

    新書(shū)發(fā)布——《實(shí)時(shí)操作系統(tǒng)應(yīng)用技術(shù):RT-Thread與ARM編程實(shí)踐》

    RT-Thread又一本新書(shū)《實(shí)時(shí)操作系統(tǒng)應(yīng)用技術(shù)——基于RT-Thread與ARM的編程實(shí)踐》發(fā)布,標(biāo)志著RT-Thread生態(tài)和實(shí)時(shí)操作
    的頭像 發(fā)表于 05-11 08:35 ?851次閱讀
    新書(shū)發(fā)布——《實(shí)時(shí)<b class='flag-5'>操作</b>系統(tǒng)應(yīng)用技術(shù):RT-<b class='flag-5'>Thread</b>與ARM編程實(shí)踐》

    共享單車到底是什么通信原理

    我們經(jīng)常騎的共享單車到底是什么通信原理,有人了解過(guò)嗎? 一、智能車鎖 共享單車最核心的硬件是智能車鎖,主要用于實(shí)現(xiàn)控制和定位功能。
    發(fā)表于 04-09 10:33 ?894次閱讀
    共享單車<b class='flag-5'>到底是</b>什么通信原理

    在RK3568上安裝RT-Thread,根據(jù)板級(jí)支持包操作時(shí)遇到的疑問(wèn)求解

    我想在RK3568上安裝RT-Thread,根據(jù)板級(jí)支持包操作時(shí),遇到了一些疑問(wèn),大佬求教! 我已經(jīng)完成了編譯部分,生成了rtthread.elf與rtthread.bin文件 請(qǐng)問(wèn)燒錄進(jìn)SD
    發(fā)表于 03-01 06:23

    共享單車到底是什么通信原理?

    我們經(jīng)常騎的共享單車到底是什么通信原理,有人了解過(guò)嗎?下面寶藍(lán)小編就帶大家了解下。
    的頭像 發(fā)表于 02-25 10:32 ?1468次閱讀
    共享單車<b class='flag-5'>到底是</b>什么通信原理?