欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Kotlin?協(xié)程思維模型的引入使用建立

 更新時間:2022年12月02日 08:36:23   作者:無糖可樂愛好者  
這篇文章主要為大家介紹了Kotlin?協(xié)程思維模型的引入使用及建立詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

1.協(xié)程

協(xié)程不是進(jìn)程或線程,它的執(zhí)行過程更類似于子例程或者說不帶返回值的函數(shù)調(diào)用。

一個程序可以包含多個協(xié)程,類似于一個進(jìn)程包含多個線程。線程有自己的上下文多個線程存在時它們相對獨立,切換受系統(tǒng)控制,而協(xié)程也相對獨立,也有自己的上下文,但是切換是由自己控制的,當(dāng)需要切換到其他協(xié)程時是由當(dāng)前協(xié)程控制的。

線程協(xié)程
獨立性相對獨立相對獨立
上下文有自己的上下文有自己的上下文
切換系統(tǒng)決定是否切換當(dāng)前協(xié)程決定是否切換

2.Kotlin協(xié)程

1.引入Kotlin協(xié)程

Kotlin中如果要使用協(xié)程是需要添加依賴的,它沒有被集成在標(biāo)準(zhǔn)庫中,單獨拎出來主要是為了減小標(biāo)準(zhǔn)庫的體積

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0'

那么要如何理解Kotlin協(xié)程?Kotlin協(xié)程可以理解為更輕量級的線程,協(xié)程的運行離不開線程,這有點像線程和進(jìn)程之間的關(guān)系。

2.Kotlin協(xié)程的使用

fun main() = runBlocking {
    doWorld()
}
suspend fun doWorld() = coroutineScope {  
    launch {
        delay(1000L)
        println("World!")
    }
    println("Hello")
}
//輸出結(jié)果:
//Hello
//World!

上面的代碼是Kotlin協(xié)程的一個簡單例子其中runBlocking、coroutineScope、launch是協(xié)程作用域,suspend是掛起,delay(1000L)是一個延時函數(shù)。從結(jié)果來看我們的代碼順序和輸出結(jié)果的順序不一樣,這就是Kotlin協(xié)程的魅力,我們看下面的流程圖:

3.Kotlin協(xié)程的輕量(總結(jié)的還不夠清晰)

  • 啟動 10 億個線程,這樣的代碼運行在大部分的機(jī)器上都是會因為內(nèi)存不足等原因而異常退出的。那么啟動10億個協(xié)程則不會出現(xiàn)異常因為協(xié)程是非常輕量的;
  • 協(xié)程雖然是運行在線程上的但是它并不會與某個線程綁定,而且還可以在不同線程之間切換。

4.協(xié)程的“非阻塞式”

線程是阻塞的,因為它在運行一個耗時任務(wù)時只有這個任務(wù)完成了才會執(zhí)行后面的任務(wù),而Kotlin在執(zhí)行一個耗時任務(wù)時會把這個任務(wù)放入后臺執(zhí)行,去執(zhí)行下一個任務(wù)。

fun main() {
    repeat(3) {
        Thread.sleep(1000L)
        println("Print-1:${Thread.currentThread().name}")
    }
    repeat(3) {
        Thread.sleep(900L)
        println("Print-2:${Thread.currentThread().name}")
    }
}
/*
輸出結(jié)果:
Print-1:main
Print-1:main
Print-1:main
Print-2:main
Print-2:main
Print-2:main
*/

上面的代碼是阻塞式任務(wù),可以看到兩個任務(wù)之間的等待時差是100毫秒,但是第二個repeat執(zhí)行的前提是第一個repeat執(zhí)行完畢,那么這個任務(wù)的最終耗時就是5700毫秒。

fun main() = runBlocking {
    launch {
        repeat(3) {
            delay(1000L)
            println("Print-1:${Thread.currentThread().name}")
        }
    }
    launch {
        repeat(3) {
            delay(900L)
            println("Print-2:${Thread.currentThread().name}")
        }
    }
    delay(3000L)
}
/*
輸出結(jié)果:
Print-2:main @coroutine#3
Print-1:main @coroutine#2
Print-2:main @coroutine#3
Print-1:main @coroutine#2
Print-2:main @coroutine#3
Print-1:main @coroutine#2
*/

上面的代碼是非阻塞式任務(wù),可以看到兩個任務(wù)之間的等待時差是100毫秒,第以個repeat和第二個repeat是同時執(zhí)行的,也就是說他們同時開始執(zhí)行,當(dāng)達(dá)到900毫秒時第二個repeat開始執(zhí)行,當(dāng)達(dá)到1000毫秒時第一個repeat開始執(zhí)行,那么這個任務(wù)的最終耗時就是3000毫秒。

由此可見,Kotlin 協(xié)程的“非阻塞”其實只是語言層面的,當(dāng)我們調(diào)用 JVM 層面的 Thread.sleep() 的時候,它仍然會變成阻塞式的。與此同時,這也意味著我們在協(xié)程當(dāng)中應(yīng)該盡量避免出現(xiàn)阻塞式的行為。盡量使用 delay,而不是 sleep。

到這里其實就會產(chǎn)生一個疑問,delay就能解決阻塞的問題嗎?答案是不是,解決阻塞問題的其實是Kotlin的掛起和恢復(fù)的能力,這是協(xié)程才擁有的特殊能力。

掛起和恢復(fù)又該怎么理解呢,舉個例子,現(xiàn)在有兩件事情:①燒一壺水燒開后斷開電源;②做飯;第一件事是一個耗時任務(wù),開始燒水后我去做第二件事這就是掛起,當(dāng)水燒開以后要去斷開電源這就是恢復(fù)。

5.建立思維模型

Kotlin的協(xié)程要比Java線程更抽象,因為Java的線程可以找到Thread的源碼,同時線程也是操作系統(tǒng)中的一個概念,所以理解起來較為簡單。而Kotlin的協(xié)程沒有類似的知識點可以建立關(guān)聯(lián),所以在學(xué)習(xí)Kotlin協(xié)程的時候就需要簡歷協(xié)程的思維模型, 沒有這個思維理解Kotlin協(xié)程就比較難。

如何建立Kotlin的思維模型?可以將Kotlin協(xié)程想象成一個“更加輕量級的線程”。

從包含關(guān)系上看,協(xié)程跟線程的關(guān)系,有點像線程與進(jìn)程的關(guān)系,畢竟協(xié)程不可能脫離線程運行。所以,協(xié)程可以理解為運行在線程當(dāng)中的、更加輕量的 Task

以上就是Kotlin 協(xié)程思維模型的引入使用建立的詳細(xì)內(nèi)容,更多關(guān)于Kotlin 協(xié)程思維模型的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • iBeacon使用藍(lán)牙連接范圍精確到1-3米

    iBeacon使用藍(lán)牙連接范圍精確到1-3米

    這篇文章主要為大家詳細(xì)介紹了iBeacon使用藍(lán)牙連接范圍精確到1到3米,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • Android中程序的停止?fàn)顟B(tài)詳細(xì)介紹

    Android中程序的停止?fàn)顟B(tài)詳細(xì)介紹

    這篇文章主要介紹了Android中程序的停止?fàn)顟B(tài)詳細(xì)介紹,本文講解了什么是程序的停止?fàn)顟B(tài)、為什么Android要引入這一狀態(tài)、激活狀態(tài)和停止?fàn)顟B(tài)的切換、如何變?yōu)橥V範(fàn)顟B(tài)等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • Android bindservice失敗解決方法

    Android bindservice失敗解決方法

    這篇文章主要介紹了Android bindservice失敗解決方法的相關(guān)資料,希望通過本文能幫助大家解決這樣的問題,需要的朋友可以參考下
    2017-08-08
  • Android 防止過快(多次)點擊的實現(xiàn)方法

    Android 防止過快(多次)點擊的實現(xiàn)方法

    很多用戶經(jīng)常會出現(xiàn)過快且多次點擊同一按鈕的情況,本篇文章主要介紹了Android 防止過快點擊的實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Android模擬器中窗口截圖存成文件實現(xiàn)思路及代碼

    Android模擬器中窗口截圖存成文件實現(xiàn)思路及代碼

    Android模擬器內(nèi)容是用OpenGL渲染的,所以用一般的編程截圖(如PrintWindow()等)會是黑屏。這是因為畫的東西放在framebuffer里 接下來介紹如何實現(xiàn)Android模擬器中窗口截圖存成文件,感興趣的朋友可以了解下哦
    2013-01-01
  • Android中調(diào)用系統(tǒng)的文件瀏覽器及自制簡單的文件瀏覽器

    Android中調(diào)用系統(tǒng)的文件瀏覽器及自制簡單的文件瀏覽器

    這篇文章主要介紹了Android中調(diào)用系統(tǒng)自帶的文件瀏覽器及自制簡單的文件瀏覽器的方法,這里的例子僅展示瀏覽而沒有添加復(fù)制粘貼剪切等文件管理操作,非常簡單,需要的朋友可以參考下
    2016-04-04
  • 淺析Flutter AbsorbPointer 與 IgnorePointer的區(qū)別

    淺析Flutter AbsorbPointer 與 IgnorePointer的區(qū)別

    Flutter是Google一個新的用于構(gòu)建跨平臺的手機(jī)App的SDK。這篇文章主要介紹了Flutter AbsorbPointer 與 IgnorePointer的區(qū)別,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • Android IPC機(jī)制綁定Service實現(xiàn)本地通信

    Android IPC機(jī)制綁定Service實現(xiàn)本地通信

    本文主要介紹Android IPC機(jī)制綁定Service 實現(xiàn)本地通信,通過圖解,代碼等方式給大家解釋Android IPC機(jī)制,需要參考的同學(xué)可以看一下
    2016-07-07
  • ViewPager實現(xiàn)圖片切換效果

    ViewPager實現(xiàn)圖片切換效果

    這篇文章主要為大家詳細(xì)介紹了ViewPager實現(xiàn)圖片切換效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Android使用ItemTouchHelper實現(xiàn)側(cè)滑刪除和拖拽

    Android使用ItemTouchHelper實現(xiàn)側(cè)滑刪除和拖拽

    這篇文章主要為大家詳細(xì)介紹了Android使用ItemTouchHelper實現(xiàn)側(cè)滑刪除和拖拽,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08

最新評論