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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM