国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Kotlin: 協(xié)程的四種啟動(dòng)模式(CoroutineStart)

這篇具有很好參考價(jià)值的文章主要介紹了Kotlin: 協(xié)程的四種啟動(dòng)模式(CoroutineStart)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

點(diǎn)擊查看CoroutineStart英文文檔

創(chuàng)建協(xié)程的三種方式

  1. runBlocking
    運(yùn)行一個(gè)協(xié)程并且會(huì)阻塞當(dāng)前線程,直到它完成。
  2. launch
    啟動(dòng)一個(gè)新的協(xié)程,不會(huì)阻塞當(dāng)前線程,并且返回一個(gè)Job,可以取消。
  3. async
    async和await是兩個(gè)函數(shù),這兩個(gè)函數(shù)在我們使用過(guò)程中一般都是成對(duì)出現(xiàn)的。
    async用于啟動(dòng)一個(gè)異步的協(xié)程任務(wù),await用于去得到協(xié)程任務(wù)結(jié)束時(shí)返回的結(jié)果,結(jié)果是通過(guò)一個(gè)Deferred對(duì)象返回的。

    在概念上,async 就類似于 launch。它啟動(dòng)了一個(gè)單獨(dú)的協(xié)程,這是一個(gè)輕量級(jí)的線程并與其它所有的協(xié)程一起并發(fā)的工作。不同之處在于 launch 返回一個(gè) Job 并且不附帶任何結(jié)果值,而 async 返回一個(gè) Deferred —— 一個(gè)輕量級(jí)的非阻塞 future, 這代表了一個(gè)將會(huì)在稍后提供結(jié)果的 promise。可以使用 .await() 在一個(gè)延期的值上得到它的最終結(jié)果, 但是 Deferred 也是一個(gè) Job,所以如果需要的話,你可以取消它。

CoroutineStart源碼

kotlin 幾種協(xié)成,# kotlin,kotlin,android

協(xié)程的四種啟動(dòng)模式一:DEFAULT

Default——根據(jù)上下文立即調(diào)度協(xié)程執(zhí)行。
如果協(xié)程上下文的[CoroutineDispatcher]從[CoroutineDispatcher. isdispatchneeded]返回’ true ’
函數(shù),然后協(xié)程代碼被調(diào)度以供稍后執(zhí)行,而代碼被調(diào)度
被調(diào)用的協(xié)程構(gòu)建器繼續(xù)執(zhí)行。

注意[Dispatchers。unconstrained總是從它的[CoroutineDispatcher.isDispatchNeeded]返回false
函數(shù),所以用[Dispatchers. *]啟動(dòng)協(xié)程。unconstrained [DEFAULT]與使用[un分派]相同。

如果協(xié)程[Job]在它有機(jī)會(huì)開(kāi)始執(zhí)行之前被取消,那么它將不會(huì)啟動(dòng)它的執(zhí)行,但將以異常完成。

在掛起點(diǎn)的協(xié)同程序的可取消性取決于的具體實(shí)現(xiàn)細(xì)節(jié)暫停功能。使用[suspenpendcancellablecoroutine]實(shí)現(xiàn)可取消的掛起函數(shù)。

示例

fun main() = runBlocking {
    val job = launch (start = CoroutineStart.DEFAULT){
        println("開(kāi)始執(zhí)行耗時(shí)操作...")
        delay(2000L)
        println("耗時(shí)操作結(jié)束")
    }
    delay(1000L)
    job.cancel()
    println("任務(wù)取消了")
}

運(yùn)行結(jié)果
kotlin 幾種協(xié)成,# kotlin,kotlin,android

協(xié)程的四種啟動(dòng)模式二:LAZY

僅在需要時(shí)才惰性地啟動(dòng)協(xié)程。

詳細(xì)信息請(qǐng)參見(jiàn)相應(yīng)協(xié)程構(gòu)建器的文檔
(如[launch][CoroutineScope])。launch]和[async][coroutincope .async])。

如果協(xié)程[Job]在它有機(jī)會(huì)開(kāi)始執(zhí)行之前被取消,那么它將不會(huì)啟動(dòng)它的執(zhí)行,但將以異常完成。


fun main() = runBlocking {
    val job = async  (start = CoroutineStart.LAZY){
        println("開(kāi)始執(zhí)行耗時(shí)操作...")
        delay(2000L)
        println("耗時(shí)操作結(jié)束")
    }
    delay(1000L)
    job.cancel()
    println("任務(wù)取消了")
    job.await()
}

運(yùn)行結(jié)果
kotlin 幾種協(xié)成,# kotlin,kotlin,android

協(xié)程的四種啟動(dòng)模式三:ATOMIC

自動(dòng)地(即,以一種不可取消的方式)根據(jù)上下文調(diào)度協(xié)程的執(zhí)行。
這類似于[DEFAULT],但是協(xié)程在開(kāi)始執(zhí)行之前不能被取消。

在掛起點(diǎn)的協(xié)程是否可取消,取決于掛起函數(shù)如[DEFAULT]。

@ExperimentalCoroutinesApi //從1.0.0開(kāi)始,沒(méi)有穩(wěn)定性的ETA


fun main() = runBlocking {
    val job = async(start = CoroutineStart.ATOMIC) {
        println("開(kāi)始執(zhí)行耗時(shí)操作...")
        //在掛起點(diǎn)之前不會(huì)被取消
        delay(2000L)//這里就是一個(gè)掛起點(diǎn), delay是掛起函數(shù)
        println("耗時(shí)操作結(jié)束")
    }
    delay(1000L)
    job.cancel()
    println("任務(wù)取消了")
}

運(yùn)行結(jié)果
kotlin 幾種協(xié)成,# kotlin,kotlin,android

協(xié)程的四種啟動(dòng)模式四:UNDISPATCHED

立即執(zhí)行協(xié)程,直到它在當(dāng)前線程中的第一個(gè)掛起點(diǎn)
協(xié)程是使用[dispatchers . unconstrained]啟動(dòng)的。但是,當(dāng)協(xié)程從暫停狀態(tài)恢復(fù)時(shí)
根據(jù)上下文中的[CoroutineDispatcher]進(jìn)行分派。

這類似于[ATOMIC],因?yàn)閰f(xié)程即使已經(jīng)被取消也會(huì)開(kāi)始執(zhí)行。
但不同之處在于它在同一個(gè)線程中開(kāi)始執(zhí)行。

在掛起點(diǎn)的協(xié)程是否可取消,取決于掛起函數(shù)如[DEFAULT]。

注:這是一個(gè)實(shí)驗(yàn)性api。當(dāng)使用此模式時(shí),協(xié)程的執(zhí)行語(yǔ)義可能會(huì)在將來(lái)發(fā)生變化。
@ExperimentalCoroutinesApi //從1.0.0開(kāi)始,沒(méi)有穩(wěn)定性的ETA

fun main() = runBlocking {
    val job = async(context = Dispatchers.IO, start = CoroutineStart.UNDISPATCHED) {
        println("開(kāi)始執(zhí)行耗時(shí)操作... ${Thread.currentThread().name}")
        //在掛起點(diǎn)之前不會(huì)被取消
        delay(2000L)//這里就是一個(gè)掛起點(diǎn), delay是掛起函數(shù)
        println("耗時(shí)操作結(jié)束...${Thread.currentThread().name}")
    }
    delay(1000L)
    job.cancel()
    println("任務(wù)取消了...${Thread.currentThread().name}")
}

運(yùn)行結(jié)果
kotlin 幾種協(xié)成,# kotlin,kotlin,android

從上圖可以看到, async(context = Dispatchers.IO, start = CoroutineStart.UNDISPATCHED) ,但是還在主線程執(zhí)行的。

推薦

Kotlin:組合掛起函數(shù)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-856249.html

到了這里,關(guān)于Kotlin: 協(xié)程的四種啟動(dòng)模式(CoroutineStart)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Kotlin 如何確定協(xié)程是否啟動(dòng)

    在Kotlin中,你可以確定協(xié)程是否已啟動(dòng)并正在運(yùn)行,可以使用 Job接口 來(lái)管理協(xié)程,并使用一些函數(shù)來(lái)檢查協(xié)程的狀態(tài)。以下是一些常見(jiàn)的方法: 1.launch 函數(shù)返回一個(gè) Job 對(duì)象,可以使用這個(gè)對(duì)象來(lái)確定協(xié)程的狀態(tài)。例如: 在上面的示例中,isActive 函數(shù)用于檢查協(xié)程是否處于

    2024年02月08日
    瀏覽(32)
  • docker中的四種網(wǎng)絡(luò)模式

    docker中的四種網(wǎng)絡(luò)模式

    Docker使用Linux橋接,在宿主機(jī)虛擬一個(gè)Docker容器網(wǎng)橋(docker0),Docker啟動(dòng)一個(gè)容器時(shí)會(huì)根據(jù)Docker網(wǎng)橋的網(wǎng)段分配給容器一個(gè)IP地址,稱為Container-IP,同時(shí)Docker網(wǎng)橋是每個(gè)容器的默認(rèn)網(wǎng)關(guān)。因?yàn)樵谕凰拗鳈C(jī)內(nèi)的容器都接入同一個(gè)網(wǎng)橋,這樣容器之間就能夠通過(guò)容器的Container-IP直接

    2024年02月04日
    瀏覽(39)
  • 單例模式的四種創(chuàng)建方式

    單例模式是日常開(kāi)發(fā)中最常見(jiàn)的一種設(shè)計(jì)模式,常用來(lái)做為池對(duì)象,或者計(jì)數(shù)器之類的需要保證全局唯一的場(chǎng)景。 單例模式的目的是保證在整個(gè)程序中只存在一個(gè)對(duì)象實(shí)例,使用單例一個(gè)前提條件就是構(gòu)造器私有化,不允許通過(guò)new 對(duì)象的方式。單例模式的實(shí)現(xiàn)主要方式有如

    2024年02月01日
    瀏覽(27)
  • redis的四種模式優(yōu)缺點(diǎn)

    redis的四種模式優(yōu)缺點(diǎn)

    Redis是一個(gè)完全開(kāi)源的內(nèi)存數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)工具,它支持多種數(shù)據(jù)結(jié)構(gòu),以及多種功能。Redis還提供了持久化功能,可以將數(shù)據(jù)存儲(chǔ)到磁盤上,以便在重啟后恢復(fù)數(shù)據(jù)。由于其高性能、可靠性和靈活性,Redis被廣泛應(yīng)用于緩存、會(huì)話管理、排行榜、實(shí)時(shí)分析、消息隊(duì)列等領(lǐng)域。

    2024年02月15日
    瀏覽(21)
  • SpringBoot項(xiàng)目啟動(dòng)后執(zhí)行指定方法的四種實(shí)現(xiàn)

    SpringBoot項(xiàng)目啟動(dòng)后執(zhí)行指定方法的四種實(shí)現(xiàn)

    今日的好天氣 距離上一次更新帖子已經(jīng)過(guò)了很久很久,久到我也不知道我在搞什么飛機(jī)。 國(guó)慶節(jié)第一天終于搬到了新家,最近量子糾纏比較火,冬天也在路上,匆匆又一年。 @PostConstruct是Java自帶的注解,在方法上加該注解會(huì)在項(xiàng)目啟動(dòng)的時(shí)候執(zhí)行該方法,也可以理解為在

    2023年04月15日
    瀏覽(18)
  • burp suite爆破的四種模式解析

    burp suite爆破的四種模式解析

    Sniper(狙擊手模式): 如果爆破點(diǎn)設(shè)置一個(gè),爆破字典是5條,那么就爆破5次 例如爆破點(diǎn)為一個(gè) 字典列表為(admin,admin@123,administrator,console,system) ? 如果爆破點(diǎn)為兩個(gè)那么就爆破10次(兩個(gè)爆破點(diǎn)依次爆破,比如兩個(gè)爆破字段 賬號(hào)和密碼,先爆破賬號(hào)字段(五次)在爆

    2024年02月13日
    瀏覽(20)
  • Docker的四種網(wǎng)絡(luò)模式和相關(guān)網(wǎng)絡(luò)命令

    Docker的四種網(wǎng)絡(luò)模式和相關(guān)網(wǎng)絡(luò)命令

    docker 使用linux 橋接,在宿主機(jī)虛擬一個(gè)docker 容器網(wǎng)橋(docker0) ,docker 啟動(dòng)一個(gè)容器時(shí)會(huì)根據(jù)docker 網(wǎng)橋的網(wǎng)段分配給容器一個(gè)IP地址,稱為Container-IP,同時(shí)Docker 網(wǎng)橋是每個(gè)容器的默認(rèn)網(wǎng)關(guān)。因?yàn)樵谕凰拗鳈C(jī)內(nèi)的容器都接入同一個(gè)網(wǎng)橋,這樣容器之間就能夠通過(guò)容器的 Cont

    2024年02月05日
    瀏覽(17)
  • 解決iphone卡在恢復(fù)模式的四種方法

    解決iphone卡在恢復(fù)模式的四種方法

    比如系統(tǒng)升級(jí)的時(shí)候卡在恢復(fù)模式、降級(jí)系統(tǒng)、或者是在手機(jī)越獄過(guò)程中以及一些誤操作可能手機(jī)就莫名其妙的進(jìn)入到了iPhone恢復(fù)模式。 恢復(fù)模式在平時(shí)的應(yīng)用主要是在iPhone連接電腦的時(shí)候,電腦無(wú)法識(shí)別到手機(jī),我們將iPhone調(diào)至恢復(fù)模式就能夠被電腦識(shí)別到了,之前我也分

    2024年02月10日
    瀏覽(21)
  • 微服務(wù)13-Seata的四種分布式事務(wù)模式

    微服務(wù)13-Seata的四種分布式事務(wù)模式

    XA模式分為兩種情況 : 提交成功: 提交失?。?具有強(qiáng)一致性seata相當(dāng)于是在RM上做了一層封裝; XA模式 優(yōu)點(diǎn) : 1.事務(wù)的強(qiáng)一致性,只要有失敗的,TC事務(wù)協(xié)調(diào)者就會(huì)發(fā)送信息讓RM回滾——滿足ACID原則 2.沒(méi)有代碼侵入,常用數(shù)據(jù)庫(kù)都支持 缺點(diǎn) : 1.第一階段就要鎖定數(shù)據(jù)庫(kù)資源

    2024年02月07日
    瀏覽(42)
  • 【Kotlin 協(xié)程】Flow 流展平 ( 連接模式 flatMapConcat | 合并模式 flatMapMerge | 最新展平模式 flatMapLatest )

    【Kotlin 協(xié)程】Flow 流展平 ( 連接模式 flatMapConcat | 合并模式 flatMapMerge | 最新展平模式 flatMapLatest )

    Flow 流在 接收元素 時(shí) , 可能需要 另一個(gè) 流的元素 , 兩個(gè)流之間進(jìn)行 交互的操作 就是 展平 , 常見(jiàn)的 展平模式有 : 連接模式 flatMapConcat : m 個(gè)元素的流 與 n 個(gè)元素的流 連接后 , 元素個(gè)數(shù)為 m x n 個(gè) ; 合并模式 flatMapMerge : m 個(gè)元素的流 與 n 個(gè)元素的流 合并后 , 元素個(gè)數(shù)為 n x

    2023年04月08日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包