1. 程式人生 > >快速學習Kotlin(十一)協程

快速學習Kotlin(十一)協程

協程是什麼?

從本質上來講,協程就是一個輕量級的執行緒。執行緒是由系統(語言系統或者作業系統)進行排程的,切換時有著一定的開銷。而協程,它的切換由程式自己來控制,無論是 CPU 的消耗還是記憶體的消耗都大大降低。

在協程中某段程式碼是可以暫停的,這時候可以去轉而執行另一段程式碼;並且在執行完另一段程式碼之後又可以回來執行當前暫停的程式碼。這樣所有的程式碼便可以在你的控制之下隨心所欲的進行操作。

啟動協程

  • runBlocking:

用於執行協程任務,通常只用於啟動最外層的協程。用於執行緒環境與協程環境的一個排程,也就是說線上程切換到協程環境的時候會去用到runBlocking。

  • launch:Job

用於執行協程任務,他最終會返回一個Job型別的物件,這個Job是一個介面,裡面有我們常用的函式,比如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:主執行緒即將退出。。。");
}

//結果列印
0
1
main:主執行緒等待中。。。
main:主執行緒即將退出。。。

可以看到我們在main函式最外層包裹了一個runBlocking用於處理執行緒與協程的切換。之後在程式碼內部用了一個laucn來開啟一個協程,裡面用repeat執行重複操作,用delay延時來模擬我們一般的耗時操作。可以看到列印結果是隻列印了0和1。因為在repeat裡面的delay延時時間為500毫秒,外層的delay延時操作為1000毫秒,當執行了兩次500之後便跑到外層來了,接著列印“main:主執行緒等待中。。。”,之後執行cancel結束,最後列印“main:主執行緒即將退出。。。”

  • async/await:Deferred

這是兩個函式,但是我們在使用的時候一般都是成對的使用它們。async用於啟動非同步協程任務,而await用於處理非同步協程任務返回結果,而這個結果是通過Deferred返回的。


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

    var job = async {
        delay(500L);
        [email protected] "hello world";
    }

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

}

//結果列印
result:hello world

我們看到,這裡使用async執行非同步操作,之後將hello world返回,由async這個介面的返回值通過await()接收打印出來。

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