kotlin的協(xié)程监署,這里專門指的是kotlin

什么是協(xié)程颤专?

來源于維基百科:協(xié)程(英語:coroutine)是計算機程序的一類組件纽哥,推廣了協(xié)作式多任務子程序,允許執(zhí)行被掛起與被恢復栖秕。相對子例程而言春塌,協(xié)程更為一般和靈活,但在實踐中使用沒有子例程那樣廣泛。協(xié)程更適合于用來實現彼此熟悉的程序組件只壳,如協(xié)作式多任務俏拱、異常處理事件循環(huán)吼句、迭代器锅必、無限列表管道

  • 協(xié)程的概念沒有統(tǒng)一的定義惕艳,kotlin的協(xié)程就是kotlin官方提供的一套API搞隐,就是一套線程框架,好在哪里:方便远搪,最方便的地方在同一個代碼塊內進行多次線程的切換


    image.png

總結一下劣纲,不要想的那么難,就是:

  • 協(xié)程就是一個線程框架
  • 協(xié)程掛起的本質就是線程切出去再切回來

為什么需要協(xié)程谁鳍?非阻塞式掛起

方便癞季,借助了kotlin的語言優(yōu)勢,其實最有用的是:用同步的方式寫出異步代碼倘潜,就是說:非阻塞式掛起绷柒。

  • 其實這一點我個人感覺好像和es7 差不多呀,前段時間自己寫了一個小程序涮因,看下里面的代碼辉巡,就是好多語言都在使用這個特性


    image.png

    image.png
同步的方式寫出異步代碼
  • 線程阻塞很好理解,現實中的例子就是交通堵塞蕊退,它的核心有 3 點:
    1郊楣、前面有障礙物,你過不去(線程卡了)
    2瓤荔、需要等障礙物清除后才能過去(耗時任務結束)
    3净蚤、除非你繞道而行(切到別的線程)
  • 非阻塞式掛起:因為掛起,肯定不在一個線程了输硝,就涉及到多線程了今瀑,線程阻塞其實是對單線程來說的,一旦切了線程点把,那肯定是非阻塞的橘荠,跑到別的線程了,之前的線程就自由了

一句話:非阻塞式掛起就是講協(xié)程在掛起的同時切線程這件事情

阻塞的本質

首先郎逃,所有的代碼本質上都是阻塞式的哥童,而只有比較耗時的代碼才會導致人類可感知的等待,比如在主線程上做一個耗時 50 ms 的操作會導致界面卡掉幾幀褒翰,這種是我們人眼能觀察出來的贮懈,而這就是我們通常意義所說的「阻塞」匀泊。

舉個例子,當你開發(fā)的 app 在性能好的手機上很流暢朵你,在性能差的老手機上會卡頓各聘,就是在說同一行代碼執(zhí)行的時間不一樣。

網絡 IO 的例子抡医,IO 阻塞更多是反映在「等」這件事情上躲因,它的性能瓶頸是和網絡的數據交換,你切多少個線程都沒用忌傻,該花的時間一點都少不了毛仪。

而這跟協(xié)程半毛錢關系沒有,切線程解決不了的事情芯勘,協(xié)程也解決不了箱靴。

協(xié)程與線程

  • 協(xié)程就是基于線程來實現的一種更上層的工具 API,類似于 Java 自帶的 Executor 系列 API 或者 Android 的 Handler 系列 API荷愕。

  • 只不過呢衡怀,協(xié)程它不僅提供了方便的 API,在設計思想上是一個基于線程的上層框架安疗,你可以理解為新造了一些概念用來幫助你更好地使用這些 API抛杨,僅此而已。

Kotlin 協(xié)程的三大疑問:協(xié)程是什么荐类、掛起是什么怖现、掛起的非阻塞式?

1.協(xié)程就是切線程
2.掛起就是可以自動切回來的切線程
3.掛起的非阻塞式指的是它能用看起來阻塞的代碼寫出非阻塞的操作

  • Kotlin 協(xié)程并沒有脫離 Kotlin 或者 JVM 創(chuàng)造新的東西,它只是將多線程的開發(fā)變得更簡單了玉罐,可以說是因為 Kotlin 的誕生而順其自然出現的東西屈嗤,從語法上看它很神奇

@Deprecated

  • suspend 函數,掛起函數吊输,是個關鍵字饶号,不會柱塞線程


    image.png

image.png

suspend 關鍵字作用:提醒作用,提醒我是一個耗時函數季蚂,你需要在協(xié)程里面調用茫船,提醒能讓我們主線程不卡,并沒有實際上去掛起

到底什么是「非阻塞式」掛起扭屁?協(xié)程真的比線程更輕量級嗎算谈?

  • 「非阻塞式」掛起
    不卡線程=非阻塞式料滥。java Thread 也是「非阻塞式」

  • 協(xié)程就是切線程幔欧,掛起就是可以自動切回來的切線程礁蔗,非阻塞是指的是協(xié)程可以用開起來阻塞的代碼協(xié)程非阻塞的操作

  • kotlin官方文檔的錯誤:同時執(zhí)行10萬個延時任務晒骇,用協(xié)程沒有問題洪囤,用線程多半要內存溢出


    image.png

    image.png
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末剥啤,一起剝皮案震驚了整個濱河市府怯,隨后出現的幾起案子牺丙,更是在濱河造成了極大的恐慌冲簿,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異野舶,居然都是意外死亡,警方通過查閱死者的電腦和手機一屋,發(fā)現死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蔚出,“玉大人,你說我怎么就攤上這事悦冀√だ樱” “怎么了宙帝?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵浩螺,是天一觀的道長要出。 經常有香客問我或颊,道長囱挑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任唆涝,我火速辦了婚禮,結果婚禮上啰扛,老公的妹妹穿的比我還像新娘。我一直安慰自己诫睬,他們只是感情好,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布纫版。 她就那樣靜靜地躺著癞己,像睡著了一般痹雅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天悯仙,我揣著相機與錄音,去河邊找鬼锡垄。 笑死沦零,一個胖子當著我的面吹牛,可吹牛的內容都是我干的货岭。 我是一名探鬼主播路操,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼千贯!你這毒婦竟也來了屯仗?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤搔谴,失蹤者是張志新(化名)和其女友劉穎魁袜,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體敦第,經...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡峰弹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了芜果。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鞠呈。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖右钾,靈堂內的尸體忽然破棺而出蚁吝,到底是詐尸還是另有隱情,我是刑警寧澤霹粥,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布灭将,位于F島的核電站,受9級特大地震影響后控,放射性物質發(fā)生泄漏庙曙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一浩淘、第九天 我趴在偏房一處隱蔽的房頂上張望捌朴。 院中可真熱鬧,春花似錦张抄、人聲如沸砂蔽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽左驾。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诡右,已是汗流浹背安岂。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留帆吻,地道東北人域那。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像猜煮,于是被迫代替她去往敵國和親次员。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內容