Kotlin 協(xié)程的非阻塞掛起

類似rxjava的線程框架
可調(diào)度線程不需要回調(diào)

image.png

協(xié)程執(zhí)行到中途調(diào)用suspend修飾的方法就是一個掛起操作

需要注意的是suspend只能算是一個提醒


image.png

如果你創(chuàng)建一個 suspend 函數(shù)但它內(nèi)部不包含真正的掛起邏輯,編譯器會給你一個提醒:redundant suspend modifier,告訴你這個 suspend 是多余的。

因為你這個函數(shù)實質(zhì)上并沒有發(fā)生掛起,那你這個 suspend 關(guān)鍵字只有一個效果:就是限制這個函數(shù)只能在協(xié)程里被調(diào)用,如果在非協(xié)程的代碼中調(diào)用,就會編譯不通過。

所以,創(chuàng)建一個 suspend 函數(shù),為了讓它包含真正掛起的邏輯,要在它內(nèi)部直接或間接調(diào)用 Kotlin 自帶的 suspend 函數(shù),你的這個 suspend 才是有意義的。

重點了 什么是非阻塞掛起

因為根據(jù)圖一協(xié)程中[假設(shè)delay(5000)沒有被注釋 ] Log輸出3需要需要等fun1執(zhí)行完畢才會執(zhí)行
這里看起來明明就是阻塞的對吧

從語義上理解「非阻塞式掛起」,講的是「非阻塞式」這個是掛起的一個特點,也就是說,協(xié)程的掛起,就是非阻塞式的,協(xié)程是不講「阻塞式的掛起」的概念的。
我們講「非阻塞式掛起」,其實它有幾個前提:并沒有限定在一個線程里說這件事,因為掛起這件事,本來就是涉及到多線程。
就像視頻里講的,阻塞不阻塞,都是針對單線程講的,一旦切了線程,肯定是非阻塞的,你都跑到別的線程了,之前的線程就自由了,可以繼續(xù)做別的事情了。
所以「非阻塞式掛起」,其實就是在講協(xié)程在掛起的同時切線程這件事情。

ps:因為它在寫法上和單線程的阻塞式是一樣的。協(xié)程只是在寫法上「看起來阻塞」,其實是「非阻塞」的,因為在協(xié)程里面它做了很多工作,其中有一個就是幫我們切線程。

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

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