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

協(xié)程執(zhí)行到中途調(diào)用suspend修飾的方法就是一個掛起操作
需要注意的是suspend只能算是一個提醒

如果你創(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é)程里面它做了很多工作,其中有一個就是幫我們切線程。