1 suspend函數 掛起的不是線程,也不是函數 !而是掛起的協程塊,將協程塊切到另一個線程
2 協程塊就是
launch(Dispatchers.Main){
\\ todo 在這裏!!
} 裏的代碼複製代碼
1 ************協程的掛起本質就是切線程 *************
2 基於線程而實現的一套更上層的工具API
3 只不過掛起函數執行完畢後,協程會稍後自動從新切回它原先的所在線程複製代碼
先別看圖,看懂下面的描述,再對應圖裏的代碼bash
1 聲明的suspend從當前線程(main)開始掛起,脫離當前執行它的的線程,協程塊suspend裏的代碼就沒有在當前線程跑了異步
2 當前線程( main )遇到suspend函數時 就等於跳過當前代碼(suspend裏的邏輯代碼,suspend被掛起),而掛起的邏輯代碼在它聲明的指定線程裏(IO)等待執行..。 async
3 執行完IO後,函數又會幫咱們自動切回到main線程,能夠設置特殊的Dispathcers(調度器) ,不切回去。ide
4 Dispathcers 指定協程執行的線程 ,還能在suspned掛起函數執行完以後,自動再切回去函數
注意的地方是 ,掛起後 不是這個協程塊停下來了!像異步分發工具
並非聲明它了 ,函數就立馬掛起了,真正起決定的是裏面聲明相似 withContext(Dispathcers.IO)、async() 等函數裏的底部代碼post
async() 也是建立協程的函數ui
第一節筆記 juejin.im/post/5d8393…spa
視頻課www.bilibili.com/video/av682… @扔物線 期待下一節協程講課
線程