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這種是不對的,須要適應新的寫法。