快速學習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()接收打印出來。
如果覺得我的文章能夠幫助到你,也歡迎關注我的微信公眾號「晨雨細曲」,有新技術和知識會推送在這上面。