Kotlin協程第一個示例剖析:
上一次https://www.cnblogs.com/webor2006/p/11712521.html已經對Kotlin中的協程有了理論化的了解了,這次則用代碼來直觀的感受一下協程,先用一個Hello World級別的示例來進行,這里新建一個工程:
默認的gradle的配置如下:
下面得修改一下,增加協程相關的依賴:
此時編譯完之后就會有如下依賴包:
然后再建一個kotlin的源代碼目錄,目前只有一個java:
好,接下來新建一個Kotlin的測試文件開始擼碼:
在我們之前編寫的程序中都是用的帶參數的main()方法,其實也可以不要參數,那咱們使用一下無參的main()方法:
那協程怎么創建呢?先來回憶一下上一次的理論:
但是CoroutineScope是一個接口,如下:
所以這里得用它的實現類:
而看一下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這種是不對的,需要適應新的寫法。