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

Kotlin協(xié)程的JVM實現(xiàn)源碼分析(上)

這篇具有很好參考價值的文章主要介紹了Kotlin協(xié)程的JVM實現(xiàn)源碼分析(上)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

本文從協(xié)程的啟動launch源碼入手分析,協(xié)程JVM實現(xiàn)分為兩篇:

  1. 協(xié)程啟動和執(zhí)行源碼分析
  2. 無棧協(xié)程 和 Continuation

基本環(huán)境:

  • IntelliJ IDEA 2023.3.2
  • Kotlin 1.8.20
  • kotlinx-coroutines-core 1.7.3
  • gradle 8.2

一、協(xié)程的啟動和執(zhí)行

GlobalScope.launch 啟動協(xié)程分析:

public fun CoroutineScope.launch(
    context: CoroutineContext = EmptyCoroutineContext,
    start: CoroutineStart = CoroutineStart.DEFAULT,
    block: suspend CoroutineScope.() -> Unit
): Job {
    val newContext = newCoroutineContext(context)
    val coroutine = if (start.isLazy)
        LazyStandaloneCoroutine(newContext, block) else
        StandaloneCoroutine(newContext, active = true)
    coroutine.start(start, coroutine, block)
    return coroutine
}

調用關系:CoroutineScope.launch -> StandaloneCoroutine.start ->
CoroutineStart.invoke -> block.startCoroutineCancellable。

1. startCoroutineCancellable 啟動流程

啟動協(xié)程,默認 執(zhí)行 block.startCoroutineCancellable 擴展方法:

internal fun <R, T> (suspend (R) -> T).startCoroutineCancellable(
    receiver: R, completion: Continuation<T>,
    onCancellation: ((cause: Throwable) -> Unit)? = null
) =
    runSafely(completion) {
        createCoroutineUnintercepted(receiver, completion).intercepted().resumeCancellableWith(Result.success(Unit), onCancellation)
    }

說明:

  1. createCoroutineUnintercepted, 創(chuàng)建 Continuation;
  2. intercepted,攔截生成 DispatchedContinuation;
  3. resumeCancellableWith,調度器 派發(fā) 執(zhí)行協(xié)程。
intercepted()

關鍵在 intercepted() 方法:

  • 獲取 ContinuationInterceptor,默認值是 Dispatchers.Default,
  • 使用 CoroutineDispatcher.interceptContinuation 生成 DispatchedContinuation
// ContinuationImpl 攔截方法
@Transient
private var intercepted: Continuation<Any?>? = null

public fun intercepted(): Continuation<Any?> =
    intercepted
        ?: (context[ContinuationInterceptor]?.interceptContinuation(this) ?: this)
            .also { intercepted = it }

// Dispatchers.Default 源碼
public final override fun <T> interceptContinuation(continuation: Continuation<T>): Continuation<T> =
    DispatchedContinuation(this, continuation)
resumeCancellableWith

DispatchedContinuation.resumeCancellableWith 實現(xiàn)了 調度器(線程池)的任務 派發(fā),也就是 Runnable

inline fun resumeCancellableWith(
    result: Result<T>,
    noinline onCancellation: ((cause: Throwable) -> Unit)?
) {
    val state = result.toState(onCancellation)
    if (dispatcher.isDispatchNeeded(context)) {
        _state = state
        resumeMode = MODE_CANCELLABLE
        dispatcher.dispatch(context, this)
    } else {
        executeUnconfined(state, MODE_CANCELLABLE) {
            if (!resumeCancelled(state)) {
                resumeUndispatchedWith(result)
            }
        }
    }
}

默認執(zhí)行到
dispatcher.dispatch(context, this),此時調度器 派發(fā) 執(zhí)行。
DispatchedContinuation 實現(xiàn)了 Runnable 接口, run() 調用即開始執(zhí)行階段,接下來分析。

2. DispatchedContinuation

DispatchedContinuation 繼承 DispatchedTask,委托了 Contanuation。

協(xié)程的最終執(zhí)行:

DispatchedContinuation.resumeCancellableWith -> dispatcher.dispatch()
-> DispatchedTask.run() -> DispatchedContinuation.continuation.resumeWith

最終 DispatchedContinuation.continuation 也就是我們 launch {} 塊生成的 SuspendLambda 類對象。

ContinuationImpl

無論是 launch {} 塊生成的 SuspendLambda類,還是 suspend fun 函數(shù) 生成 ContinuationImpl 匿名類。
它們都 繼承 BaseContinuationImpl。

基類 BaseContinuationImpl,實現(xiàn)了 resumeWith

try {
    val outcome = invokeSuspend(param)
    if (outcome === COROUTINE_SUSPENDED) return
    Result.success(outcome)
} catch (exception: Throwable) {
    Result.failure(exception)
}

調用了 抽象 invokeSuspend,也就是 launch {} 塊編譯后的代碼。

執(zhí)行完成后,會執(zhí)行 協(xié)程 completion.resumeWith(outcome),最終完成。

resumeWith -> onCompletionInternal -> onCompleted 或 onCancelled

launch {} 塊編譯代碼分析

launch {}async {} 編譯后,都繼承 SuspendLambda

反編譯.class,通過 jadx-gui 看到 塊 代碼一般是下面 形式:

public static final class AnonymousClass1 extends SuspendLambda implements Function2<CoroutineScope, Continuation<? super Unit>, Object> {
    int label;

    @NotNull
    public final Continuation<Unit> create(@Nullable Object value, @NotNull Continuation<?> continuation) {
        return new AnonymousClass1(continuation);
    }

    @Nullable
    public final Object invoke(@NotNull CoroutineScope p1, @Nullable Continuation<? super Unit> continuation) {
        return create(p1, continuation).invokeSuspend(Unit.INSTANCE);
    }

    @Nullable
    public final Object invokeSuspend(@NotNull Object $result) {
        // launch {} 執(zhí)行代碼塊 邏輯,會編譯到這里
        ...
    }
}

小結

通過launch啟動協(xié)程源碼分析,了解了:文章來源地址http://www.zghlxwxcb.cn/news/detail-805562.html

  • Dispatchers 調度器何時派發(fā)任務
  • 協(xié)程 Continuation 掛起、執(zhí)行 和 恢復

補充類圖

Continuation

DispatchedContinuation

關鍵類和文件

  1. kotlin.coroutines.Continuation.kt
  2. kotlin.coroutines.CoroutineContext
  3. kotlin.coroutines.jvm.internal.BaseContinuationImpl.kt 對應 Continuation 默認實現(xiàn)。
  4. kotlinx.coroutines.CoroutineStart 啟動線程方式、調用

文檔

  • kotlin coroutines
  • kotlin KEEP | Offcial
  • Advanced coroutines concepts | Android
  • 分析Kotlin協(xié)程實現(xiàn)原理
  • 探索 Kotlin 協(xié)程原理
  • KotlinConf 2017 - Deep Dive into Coroutines on JVM
  • Koltin 協(xié)程(非阻塞式掛起)實現(xiàn)原理(五)
  • kotlinx-coroutines-core 1.7.3源碼
  • https://doordash.engineering/2021/11/09/the-beginners-guide-to-kotlin-coroutine-internals/
  • CancellableContinuationImpl.kt

到了這里,關于Kotlin協(xié)程的JVM實現(xiàn)源碼分析(上)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

  • 深入分析 Java、Kotlin、Go 的線程和協(xié)程

    深入分析 Java、Kotlin、Go 的線程和協(xié)程

    Go 語言比 Java 語言性能優(yōu)越的一個原因,就是輕量級線程 Goroutines (協(xié)程Coroutine)。本篇文章深入分析下 Java 的線程和 Go 的協(xié)程。 協(xié)程并不是 Go 提出來的新概念,其他的一些編程語言,例如:Go、Python 等都可以在語言層面上實現(xiàn)協(xié)程,甚至是 Java,也可以通過使用擴展庫來

    2024年02月01日
    瀏覽(26)
  • Plugin [id: ‘org.jetbrains.kotlin.jvm‘, version: ‘1.8.21‘] was not found

    Plugin [id: ‘org.jetbrains.kotlin.jvm‘, version: ‘1.8.21‘] was not found

    使用最新的 Intellij IDEA 創(chuàng)建一個可以運行 kotlin 的代碼環(huán)境,默認創(chuàng)建 Main.kt 文件。 下面是默認生成的 build.gradle.kts 文件 編譯直接報錯: 更換IDEA版本(因為在很久之前學習 kotlin 的時候沒有這么費勁, IDEA 直接支持),結果無效(PS:嘗試過高低版本都不行); 添加電腦的

    2024年02月09日
    瀏覽(27)
  • 【kotlin 協(xié)程】萬字協(xié)程 一篇完成kotlin 協(xié)程進階

    【kotlin 協(xié)程】萬字協(xié)程 一篇完成kotlin 協(xié)程進階

    Kotlin 中的協(xié)程提供了一種全新處理并發(fā)的方式,可以在 Android 平臺上使用它來簡化異步執(zhí)行的代碼。協(xié)程是從 Kotlin 1.3 版本開始引入,但這一概念在編程世界誕生的黎明之際就有了,最早使用協(xié)程的編程語言可以追溯到 1967 年的 Simula 語言。 在過去幾年間,協(xié)程這個概念發(fā)展

    2024年02月07日
    瀏覽(38)
  • Kotlin 協(xié)程一 —— 協(xié)程 Coroutine

    1.1.1基本定義 進程 進程是一個具有一定獨立功能的程序在一個數(shù)據(jù)集上的一次動態(tài)執(zhí)行的過程,是操作系統(tǒng)進行資源分配和調度的一個獨立單位,是應用程序運行的載體。 進程是資源分配的最小單位,在單核CPU中,同一時刻只有一個程序在內存中被CPU調用運行。 線程 基本的

    2024年02月05日
    瀏覽(20)
  • kotlin語法進階 - 協(xié)程(一)協(xié)程基礎

    kotlin語法進階 - 協(xié)程(一)協(xié)程基礎

    協(xié)程并不是一個新的概念,而是一個非常老的概念,很多語言都支持協(xié)程,建議去瀏覽器去了解一下協(xié)程的歷史和基本概念,這里我們只講一下kotlin中的協(xié)程的作用。 從代碼實現(xiàn)角度來看:kotlin協(xié)程底層是用線程實現(xiàn)的,是一個封裝完善供開發(fā)者使用的線程框架。kotlin的一個

    2024年02月09日
    瀏覽(21)
  • Kotlin協(xié)程-從一到多

    上一篇文章,我介紹了Kotlin協(xié)程的創(chuàng)建,使用,協(xié)作等內容。本篇將引入更多的使用場景,繼續(xù)帶你走進協(xié)程世界。 常用編程語言都會內置對同一類型不同對象的數(shù)據(jù)集表示,我們通常稱之為容器類。不同的容器類適用于不同的使用場景。Kotlin的 Flow 就是在異步計算的需求下

    2024年02月09日
    瀏覽(19)
  • Android Kotlin 協(xié)程初探

    維基百科:協(xié)程,英文Coroutine [k?ru’tin] (可入廳),是計算機程序的一類組件,推廣了協(xié)作式多任務的子程序,允許執(zhí)行被掛起與被恢復。 作為Google欽定的Android開發(fā)首選語言Kotlin,協(xié)程并不是 Kotlin 提出來的新概念,目前有協(xié)程概念的編程語言有Lua語言、Python語言、Go語言

    2024年02月08日
    瀏覽(27)
  • Kotlin協(xié)程-從理論到實戰(zhàn)

    上一篇文章從理論上對Kotlin協(xié)程進行了部分說明,本文將在上一篇的基礎上,從實戰(zhàn)出發(fā),繼續(xù)協(xié)程之旅。 在Kotlin中,要想使用協(xié)程,首先需要使用協(xié)程創(chuàng)建器創(chuàng)建,但還有個前提——協(xié)程作用域( CoroutineScope )。在早期的Kotlin實現(xiàn)中,協(xié)程創(chuàng)建器是一等函數(shù),也就是說我們隨

    2024年02月09日
    瀏覽(21)
  • Kotlin協(xié)程學習之-02

    協(xié)程的基本使用 GlobalScope.launch 生命周期與進程一致,且無法取消 runBlocking 會阻塞線程,一般在測試階段可以使用 val coroutineScope = CoroutineScope(context) coroutineScope.launch 通過context參數(shù)去管理和控制協(xié)程的生命周期 用法 val coroutineScope = CoroutineScope(context) coroutineScope.launch(Dispatche

    2024年01月22日
    瀏覽(22)
  • Kotlin 協(xié)程基礎使用學習

    Kotlin 協(xié)程基礎使用學習

    原文: Kotlin 協(xié)程基礎使用學習-Stars-One的雜貨小窩 本篇閱讀可能需要以下知識,否則可能閱讀會有些困難 客戶端開發(fā)基礎(Android開發(fā)或JavaFx開發(fā)) Java多線程基礎 kotlin基礎 本文盡量以使用為主,以代碼為輔講解,不提及過深協(xié)程底層代碼邏輯,僅做一個基礎入門來快速上手學習(斷斷

    2024年03月18日
    瀏覽(53)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領取紅包

二維碼2

領紅包