快速學(xué)習(xí)Kotlin(十一)協(xié)程

Kotlin

協(xié)程是什么?

從本質(zhì)上來講,協(xié)程就是一個輕量級的線程。線程是由系統(tǒng)(語言系統(tǒng)或者操作系統(tǒng))進行調(diào)度的,切換時有著一定的開銷。而協(xié)程,它的切換由程序自己來控制,無論是 CPU 的消耗還是內(nèi)存的消耗都大大降低。

在協(xié)程中某段代碼是可以暫停的,這時候可以去轉(zhuǎn)而執(zhí)行另一段代碼;并且在執(zhí)行完另一段代碼之后又可以回來執(zhí)行當前暫停的代碼。這樣所有的代碼便可以在你的控制之下隨心所欲的進行操作。

啟動協(xié)程

  • runBlocking:

用于執(zhí)行協(xié)程任務(wù),通常只用于啟動最外層的協(xié)程。用于線程環(huán)境與協(xié)程環(huán)境的一個調(diào)度,也就是說在線程切換到協(xié)程環(huán)境的時候會去用到runBlocking。

  • launch:Job

用于執(zhí)行協(xié)程任務(wù),他最終會返回一個Job類型的對象,這個Job是一個接口,里面有我們常用的函數(shù),比如cancel、join、start等等。

fun main(args: Array<String>) = runBlocking {
    var job = launch {
        repeat(100) {
            println(it);
            delay(500L);
        }
    };
    delay(1000L);
    println("main:主線程等待中。。。");

    job.cancel();

    println("main:主線程即將退出。。。");
}

//結(jié)果打印
0
1
main:主線程等待中。。。
main:主線程即將退出。。。

可以看到我們在main函數(shù)最外層包裹了一個runBlocking用于處理線程與協(xié)程的切換。之后在代碼內(nèi)部用了一個laucn來開啟一個協(xié)程,里面用repeat執(zhí)行重復(fù)操作,用delay延時來模擬我們一般的耗時操作。可以看到打印結(jié)果是只打印了0和1。因為在repeat里面的delay延時時間為500毫秒,外層的delay延時操作為1000毫秒,當執(zhí)行了兩次500之后便跑到外層來了,接著打印“main:主線程等待中。。?!保髨?zhí)行cancel結(jié)束,最后打印“main:主線程即將退出。。。”

  • async/await:Deferred

這是兩個函數(shù),但是我們在使用的時候一般都是成對的使用它們。async用于啟動異步協(xié)程任務(wù),而await用于處理異步協(xié)程任務(wù)返回結(jié)果,而這個結(jié)果是通過Deferred返回的。


fun main(args: Array<String>) = runBlocking {

    var job = async {
        delay(500L);
        return@async "hello world";
    }

    println("result:${job.await()}");

}

//結(jié)果打印
result:hello world

我們看到,這里使用async執(zhí)行異步操作,之后將hello world返回,由async這個接口的返回值通過await()接收打印出來。

如果覺得我的文章能夠幫助到你,也歡迎關(guān)注我的微信公眾號「晨雨細曲」,有新技術(shù)和知識會推送在這上面。

?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

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