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ù),程序直接就崩潰了.
執(zhí)行clickDelay函數(shù), 控制臺(tái)提示:
總結(jié):被suspend關(guān)鍵字修飾的函數(shù)是掛起函數(shù).
掛起是一種非阻塞的執(zhí)行方式,它通過(guò)釋放線程資源來(lái)提高并發(fā)性和資源利用率. 阻塞是一種阻塞式的執(zhí)行方式.它會(huì)占用線程資源,并可能導(dǎo)致性能低下和資源浪費(fèi).