kotlin 協(xié)程 二 (suspend)

suspend 是kotlin中用于定義掛起函數(shù)的關(guān)鍵字.掛起函數(shù)是一種特殊類型的函數(shù).可以在執(zhí)行過(guò)程中暫時(shí)掛起并在稍微繼續(xù)執(zhí)行,而不會(huì)阻塞線程.掛起函數(shù)常用于協(xié)程中進(jìn)行異步操作或長(zhǎng)時(shí)間運(yùn)行的計(jì)算,以避免阻塞主線程或其他線程.

定義掛起函數(shù)

suspend fun doSomething(){
     delay(1000)
     println("Doing something")
}

doSomething 是一個(gè)掛起函數(shù).它適用了suspend關(guān)鍵字來(lái)標(biāo)記該函數(shù)為掛起函數(shù).在函數(shù)體內(nèi),可以執(zhí)行一系列的操作,包括掛起函數(shù) delay.該函數(shù)用于模擬一個(gè)耗時(shí)的操作.

需要注意的是: 掛起函數(shù)只能在其他掛起函數(shù)或協(xié)程作用域中使用. 在非協(xié)程環(huán)境中直接調(diào)用掛起函數(shù)會(huì)導(dǎo)致編譯錯(cuò)誤.

協(xié)程函數(shù)體中調(diào)用掛起函數(shù)

lifecycleScope.launch() {
     withContext(Dispatchers.IO){
           doSomething()
            "更新數(shù)據(jù)~"
      }.let {
           withContext(Dispatchers.Main){
               binding.tvText.setText(it)
           }
      }
}

總之: suspend關(guān)鍵字用于標(biāo)記掛起函數(shù).使其能夠在執(zhí)行過(guò)程中暫停并在稍后繼續(xù)執(zhí)行.這種機(jī)制使的異步操作可以以非阻塞的方式進(jìn)行,提高了代碼的可讀性和維護(hù)性.

掛起與阻塞對(duì)比

通俗來(lái)講:

  • 掛起: 下班去消費(fèi),準(zhǔn)備哈啤捋點(diǎn)小串. 你給老板說(shuō)小串先烤著, 先去買點(diǎn)其他的東西,一會(huì)回來(lái)拿烤串.

在協(xié)程中,掛起是一種非阻塞的執(zhí)行方式. 當(dāng)協(xié)程遇到掛起的點(diǎn)時(shí),它會(huì)暫停執(zhí)行并釋放線程資源,允許其他協(xié)程或任務(wù)在此執(zhí)行.通過(guò)將執(zhí)行權(quán)交給其他協(xié)程來(lái)實(shí)現(xiàn)異步操作. 例如等燒烤是一件耗時(shí)行為,當(dāng)執(zhí)行燒烤的時(shí)候 告訴老板先烤著一會(huì)過(guò)來(lái)拿,此時(shí)就釋放線程資源,并允許燒烤任務(wù)在此執(zhí)行.這個(gè)時(shí)候你可以去買其他東西,不阻礙活動(dòng).

  • 阻塞: 等著老板烤串,等老板烤好了,再去買其他東西.

阻塞是一種阻塞式的執(zhí)行方式.當(dāng)一個(gè)線程遇到阻塞操作時(shí),它會(huì)停止執(zhí)行,并等待操作完成或條件滿足,期間線程處于休眠狀態(tài),無(wú)法執(zhí)行其他任務(wù).
如上述例子: 就等燒烤,期間什么都不做. 等燒烤烤好了,再去買其他的.在此過(guò)程中沒(méi)有釋放資源,線程一直占用,無(wú)法用于執(zhí)行其他任務(wù).

var clickDelay: BindingCommand<*> = BindingCommand<Any?>(BindingAction {
    GlobalScope.launch {
        delay(5000)
        Log.e("--------","delay")
    }
})


var clickSleep: BindingCommand<*> = BindingCommand<Any?>(BindingAction {
     Thread.sleep(5000)
     Log.e("--------","sleep")
})


執(zhí)行clickSleep函數(shù), 控制臺(tái)提示:
跳過(guò)了300幀! 該應(yīng)用程序可能在其主線程上做了太多的工作誓竿。
如果時(shí)間設(shè)置稍微長(zhǎng)一些,多點(diǎn)擊clickSleep函數(shù),程序直接就崩潰了.

阻塞.png

執(zhí)行clickDelay函數(shù), 控制臺(tái)提示:


掛起.png

總結(jié):被suspend關(guān)鍵字修飾的函數(shù)是掛起函數(shù).
掛起是一種非阻塞的執(zhí)行方式,它通過(guò)釋放線程資源來(lái)提高并發(fā)性和資源利用率. 阻塞是一種阻塞式的執(zhí)行方式.它會(huì)占用線程資源,并可能導(dǎo)致性能低下和資源浪費(fèi).

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市殴边,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌街夭,老刑警劉巖夜只,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件影晓,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡犬绒,警方通過(guò)查閱死者的電腦和手機(jī)旺入,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)凯力,“玉大人茵瘾,你說(shuō)我怎么就攤上這事「篮祝” “怎么了拗秘?”我有些...
    開(kāi)封第一講書人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)祈惶。 經(jīng)常有香客問(wèn)我雕旨,道長(zhǎng),這世上最難降的妖魔是什么捧请? 我笑而不...
    開(kāi)封第一講書人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任凡涩,我火速辦了婚禮,結(jié)果婚禮上疹蛉,老公的妹妹穿的比我還像新娘活箕。我一直安慰自己,他們只是感情好可款,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布育韩。 她就那樣靜靜地躺著,像睡著了一般闺鲸。 火紅的嫁衣襯著肌膚如雪筋讨。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 52,793評(píng)論 1 314
  • 那天翠拣,我揣著相機(jī)與錄音版仔,去河邊找鬼。 笑死误墓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的益缎。 我是一名探鬼主播谜慌,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼莺奔!你這毒婦竟也來(lái)了欣范?” 一聲冷哼從身側(cè)響起变泄,我...
    開(kāi)封第一講書人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎恼琼,沒(méi)想到半個(gè)月后妨蛹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晴竞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年蛙卤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片噩死。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡颤难,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出已维,到底是詐尸還是另有隱情行嗤,我是刑警寧澤,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布垛耳,位于F島的核電站栅屏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏堂鲜。R本人自食惡果不足惜既琴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泡嘴。 院中可真熱鬧甫恩,春花似錦、人聲如沸酌予。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)抛虫。三九已至松靡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間建椰,已是汗流浹背雕欺。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棉姐,地道東北人屠列。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像伞矩,于是被迫代替她去往敵國(guó)和親笛洛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容