Kotlin協程第一個示例剖析及Kotlin線程使用技巧

Kotlin協程第一個示例剖析:html

上一次https://www.cnblogs.com/webor2006/p/11712521.html已經對Kotlin中的協程有了理論化的瞭解了,此次則用代碼來直觀的感覺一下協程,先用一個Hello World級別的示例來進行,這裏新建一個工程:java

默認的gradle的配置以下:web

下面得修改一下,增長協程相關的依賴:函數

此時編譯完以後就會有以下依賴包:學習

而後再建一個kotlin的源代碼目錄,目前只有一個java:測試

好,接下來新建一個Kotlin的測試文件開始擼碼:gradle

在咱們以前編寫的程序中都是用的帶參數的main()方法,其實也能夠不要參數,那我們使用一下無參的main()方法:url

那協程怎麼建立呢?先來回憶一下上一次的理論:spa

可是CoroutineScope是一個接口,以下:.net

因此這裏得用它的實現類:

 

而看一下GlobalScope這個類,就是它的實現類:

 

下面來看一下運行效果:

其中看一下協程中用到了一個delay(),看一下它的官方說明:

根據這個解釋,咱們再來解釋一下輸出,在運行的時候會立馬先打印出「hello」,這時由於協程的延遲是不會阻塞線程的:

 

可是此時協程本身會休眠1秒,而接着主線程要休眠2秒:

在這2秒過程當中,休眠1秒的協程則會輸出「Kotlin Coroutines」:

最後過了2秒以後,主線程則繼續執行,則「World」就打印了:

那接下來若是將主線程的休眠時間由2秒改得比協程中的休眠更短呢?

看結果:

竟然協程都木有輸出,這是由於協程是依附於線程的,當線程都退出了,固然協程也不會執行了嘛,這點能夠清楚的體會到協程的一個角色。

Kotlin線程使用技巧:

對於上面協程的效果其實能夠用純線程的方式來實現,這裏來學習一下在Koltin中使用線程的一個標準姿式,跟Java仍是有很大的區別的,以下:

運行看一下:

嗯,確實效果同樣,可是它跟協程固然仍是有區別的啦,畢境是用線程來模擬的,若是將主線程的休眠時間改短,則就不同了,這裏忽略,下面重點來理解Kotlin的這種建立線程的方式,先看一下這個thread是怎麼定義的:

其中返回的Thread是爲Java的:

那爲啥咱們在調用函數的時候直接跟了個花括號,而非圓括號?

這就須要看一下該函數定義的參數聲明瞭:

這就是Kotlin的基本功的體現了,對於Kotlin的一個高階函數而言,若是最後一個參數是Lambda表達式,則能夠以花括號的形式來傳給這個Lambda表達式,固然啦也能夠用傳統的方式來傳遞,好比:

直接用句名的方式來顯示指定要傳的參數,可是!!!這種傳統的寫法不是Kotlin推崇的正統風格,因此須要適應這種寫法,那還有個問題,爲啥這樣傳遞了以後咱們的線程中的代碼就能獲得正常執行呢?

此時就須要看一下它的官方說明了:

而start默認值就是爲true:

因此這個問題的答案就能夠知道了,好接下來繼續來讀讀其它參數的含義:

再來看一下此方法的具體實現,就知道爲啥這個方法有這樣建立線程的功效了:

其中對象表達式在以前已經學習過了,能夠參考:https://www.cnblogs.com/webor2006/p/11352421.html

下面來作個實驗,咱們手動的來將start參數置爲false,看下是否線程中的代碼塊就不會被執行了:

確實如此,固然啦這時咱們也能夠以Java的思路將其手動啓動既可,以下:

可是!!!這不是一個正常使用Kotlin的姿式,若是用Java的思惟來使用Kotlin這種是不對的,須要適應新的寫法。

相關文章
相關標籤/搜索