Kotlin協程快速入門

2021-09-11 10:16:19 字數 3207 閱讀 2045

協程,全稱可以譯作協同程式,很多語言都有這個概念和具體實現,之前入門python的時候接觸過,而kotlin其實也早就有這個擴充套件功能庫了,只不過之前一直處於實驗階段,不過前段時間1.0的正式版終於出了,網上的相關部落格也多了起來,經過這幾天的學習我也來做下小結吧。

首先貼下kotlin協程的官方github位址kotlinx.coroutines,下面的配置都是參照這裡的說明,而且裡面還貼心的給我們準備了很多基礎的示例**,感興趣的的小夥伴稍後可以去看看。

首先配置下kotlin版本

buildscript 

複製**

然後引入依賴,目前最新版是1.1.0

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.0'

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.0'

複製**

配置很簡單,接下來幹什麼呢。當然是寫個協程版的hello world了!

import kotlinx.coroutines.*

fun main

() println("hello,") // 協程延遲的時候不會影響主線程的執行

thread.sleep(2000l) // 阻塞執行緒2s,保證jvm存活,協程可正常執行完

}複製**

執行結果:

2018-12-23 17:35:16.998 15539-15539/com.renny.kotlin i/system.out: hello,

2018-12-23 17:35:18.005 15539-18893/com.renny.kotlin i/system.out: world!

複製**

上面的協程啟動模式是預設的deafault,也就是建立並立即啟動的,我們也可以設定啟動模式為lazy,來自己安排是什麼時候需要啟動:

fun

main()

println("hello,")

job.start()

thread.sleep(2000l)

}複製**

在我所採用的kotlin 1.3版本中,還有atomicundispatched兩個額外的模式,但是現在還是實驗版,這裡不多介紹。結果如上。coroutinescope.launch一共有三個引數,然後介紹其他兩個:

返回值為job物件。

通過上面的例子,我們知道了乙個重要的點launch函式是有返回值的,它是乙個job的介面型別,除了配合lazy來自己啟動乙個協程,下面介紹下其他幾個重要方法:

fun main

() job.cancel()

println("hello,")

}複製**

協程被取消了,所以只列印了hello,

fun

main

() = runblocking

println("hello,")

job.join()

println("good!")

}複製**

作用很像thread.join()函式,join()後面的**會等到協程結束再執行,結果如下:

2018-12-24 21:19:41.153 23484-23484/com.renny.kotlin i/system.out: hello,

2018-12-24 21:19:42.148 23484-24172/com.renny.kotlin i/system.out: world!

2018-12-24 21:19:43.161 23484-23484/com.renny.kotlin i/system.out: good!

複製**

public suspend fun job.cancelandjoin() 

複製**

其實通過檢視原始碼,job.join()也被suspend修飾了,所以這是乙個suspend(掛起)函式,掛起函式必須在協程中或者掛起函式中使用,因為呼叫了job.join()job.cancelandjoin()也必須加上suspend宣告。事實上,要啟動協程,必須至少有乙個掛起函式。

協程及協程掛起:

協程是通過編譯技術實現的,不需要虛擬機器vm/作業系統os的支援,通過相關**來生效

協程的掛起幾乎無代價,無需上下文切換或涉及os

協程不能在隨機指令中掛起,只能在掛起點掛起(呼叫標記函式)!

複製**

fun

main

() = runblocking

println("hello,")

runblocking

}複製**

最外層的runblocking為最高端的協程 (一般為主協程), 其他協程如launch {}因為層級較低能跑在runblocking裡。runblocking的最大特點就是它的delay()可以阻塞當前的執行緒,和thread.sleep()有著相同的效果。列印的日誌同第乙個示例。

job類中會儲存子協程的集合:

public

val children: sequence複製**

同樣也提供了取消全部子協程的方法:

public

fun job.cancelchildren()

}複製**

kotlin協程官方文件

Kotlin協程筆記

會阻塞主線程,等待協程執行完,才會繼續執行主線程 不會阻塞主線程,返回job型別的物件 var job globalscope.launch 3 async 用於啟動乙個非同步協程任務,與launch用法基本一樣,不阻塞執行緒,區別在於 async的返回值是deferred,將最後乙個封裝成了該物件...

Kotlin 協程學習記錄

kotlin 協程 implementation org.jetbrains.kotlinx kotlinx coroutines core 1.2.1 1 runblocking 會一直阻塞到塊中的 執行完 runblocking job.join 等待直到子協程執行結束 主協程與後台作業的持續時...

Kotlin 協程輕量 協程與執行緒對比

本例使用協程和執行緒兩個方式執行一段任務 協程 任務是每秒列印出兩個 執行100 000個任務 test fun testmet runblocking println val end system.currenttimemillis println end time end println 耗時 ...