0Pricing
Kotlin Academy · Pelajaran

Propagasi Pembatalan dalam Hierarki Coroutine

Pahami cara pembatalan mengalir melalui hubungan coroutine induk-anak.

Propagasi Pembatalan dalam Hierarki Coroutine adalah pelajaran Kotlin Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Kotlin Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Kotlin Academy mencakup 4 pelajaran total.

Hubungan Induk-Anak

Ketika sebuah korutin meluncurkan korutin lain dengan launch, anak tersebut bergabung dengan Job induknya. Membatalkan induk akan membatalkan semua anak.

import kotlinx.coroutines.*
fun main() = runBlocking {
    val parent = launch {
        launch { delay(1000); println("child 1") }
        launch { delay(1000); println("child 2") }
        delay(1000)
        println("parent")
    }
    delay(50)
    parent.cancel()
    parent.join()
    println("All cancelled")
}

Kegagalan Anak Membatalkan Induk

Jika seorang anak melempar pengecualian selain pembatalan, anak tersebut membatalkan induk dan semua korutin saudaranya—ini adalah perilaku bawaan Job.

import kotlinx.coroutines.*
fun main() = runBlocking {
    try {
        coroutineScope {
            launch {
                delay(50)
                throw RuntimeException("child failed")
            }
            launch {
                delay(1000)
                println("sibling — never prints")
            }
        }
    } catch (e: RuntimeException) {
        println("Caught: ${e.message}")
    }
}

Pembatalan Anak Tidak Merambat ke Atas

Pembatalan anak NOT membatalkan induk. Hanya pengecualian yang tidak tertangani yang dapat melakukannya. Induk dapat membatalkan anak kapan saja.

import kotlinx.coroutines.*
fun main() = runBlocking {
    val parent = launch {
        val child = launch {
            delay(1000)
            println("child done")
        }
        delay(50)
        child.cancel()  // cancels child
        child.join()
        println("parent still running")  // parent is fine
    }
    parent.join()
}

coroutineScope dibandingkan dengan GlobalScope

coroutineScope membuat cakupan anak: pembatalan dan kesalahan merambat. GlobalScope membuat korutin tanpa induk—hindari penggunaannya dalam produksi.

import kotlinx.coroutines.*
fun main() = runBlocking {
    try {
        coroutineScope {
            launch { delay(50); throw RuntimeException("error") }
        }
    } catch (e: Exception) {
        println("coroutineScope propagated: ${e.message}")
    }
    // GlobalScope.launch { } would NOT propagate to runBlocking
}

Membatalkan Subpohon

Setiap launch atau async mengembalikan Job. Batalkan sebuah tugas untuk membatalkan seluruh subpohonnya, termasuk semua peluncuran bersarang.

import kotlinx.coroutines.*
fun main() = runBlocking {
    val root = launch {
        launch {
            launch { delay(1000); println("deep") }
            delay(1000)
        }
    }
    delay(50)
    root.cancel()
    root.join()
    println("Whole subtree cancelled")
}

join() Setelah cancel()

Selalu panggil join() setelah cancel() untuk menunggu korutin dan anak-anaknya benar-benar berhenti sebelum melanjutkan.

import kotlinx.coroutines.*
fun main() = runBlocking {
    val job = launch {
        try { delay(1000) }
        finally { println("cleanup ran") }
    }
    delay(50)
    job.cancel()
    job.join()  // waits for finally to complete
    println("Proceeded after join")
}

cancelAndJoin()

job.cancelAndJoin() adalah kemudahan yang membatalkan lalu menggabungkan, setara dengan cancel() + join().

import kotlinx.coroutines.*
fun main() = runBlocking {
    val job = launch {
        try { delay(1000) }
        finally { println("cleanup") }
    }
    delay(50)
    job.cancelAndJoin()  // cancel + join in one call
    println("Done")
}

Perambatan melalui async

Dengan async, pengecualian disimpan dalam Deferred dan dilempar saat Anda memanggil await(). Pengecualian tersebut tetap merambat ke induk jika tidak tertangani.

import kotlinx.coroutines.*
fun main() = runBlocking {
    try {
        coroutineScope {
            val d = async { throw RuntimeException("async fail") }
            d.await()  // rethrows here
        }
    } catch (e: RuntimeException) {
        println("Caught from async: ${e.message}")
    }
}

Jaminan Konkurensi Terstruktur

Konkurensi terstruktur menjamin bahwa ketika suatu cakupan selesai, semua anaknya telah selesai. Tidak ada korutin yang bocor—semuanya selesai atau dibatalkan.

import kotlinx.coroutines.*
suspend fun doWork() = coroutineScope {
    launch { delay(100); println("work 1") }
    launch { delay(200); println("work 2") }
    // both children complete before doWork returns
}
fun main() = runBlocking {
    doWork()
    println("All work done")
}

Diagram Perambatan Pembatalan

Hierarkinya: induk dibatalkan → semua anak dibatalkan. Anak dibatalkan → hanya subpohon tersebut. Pengecualian anak → induk dibatalkan → korutin saudara dibatalkan.

import kotlinx.coroutines.*
fun main() = runBlocking {
    // Parent
    launch {
        val c1 = launch { delay(1000); println("c1") }  // child 1
        val c2 = launch { delay(1000); println("c2") }  // child 2
        delay(50)
        c1.cancel()  // only c1 cancelled
        c1.join()
        println("c2 still active: ${c2.isActive}")
        c2.cancelAndJoin()
    }.join()
}

Siklus Hidup CoroutineScope di Android

Di Android, viewModelScope dibatalkan ketika ViewModel dihapus. Semua korutin yang diluncurkan otomatis dibatalkan—tidak diperlukan pembersihan manual.

import kotlinx.coroutines.*
// Pseudocode:
// class MyViewModel : ViewModel() {
//     fun load() = viewModelScope.launch {
//         val data = repo.fetch() // cancelled if VM cleared
//         _state.value = data
//     }
// }
fun main() = runBlocking { println("viewModelScope cancels on ViewModel.onCleared()") }

Pemeriksaan Singkat

Apa yang terjadi pada korutin saudara ketika seorang anak melempar pengecualian yang tidak tertangani di bawah Job biasa?

Ringkasan

Pembatalan induk merambat ke semua anak. Kegagalan anak merambat ke induk dan korutin saudaranya (dengan Job biasa). Gunakan cancelAndJoin() untuk penghentian yang bersih. Konkurensi terstruktur memastikan tidak ada korutin yang bocor.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Propagasi Pembatalan dalam Hierarki Coroutine” gratis?

Ya — teks lengkap “Propagasi Pembatalan dalam Hierarki Coroutine” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Kotlin Academy, upgrade ke CoddyKit PRO. Kursus Kotlin Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Propagasi Pembatalan dalam Hierarki Coroutine”?

Pahami cara pembatalan mengalir melalui hubungan coroutine induk-anak. Kamu berlatih Kotlin Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Kotlin Academy?

Tidak diperlukan pengalaman sebelumnya. Kotlin Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Propagasi Pembatalan dalam Hierarki Coroutine” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Kotlin Academy ini?

Ya. Setiap pelajaran Kotlin Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Pembatalan Kooperatif: isActive dan ensureActive
  2. withTimeout dan withTimeoutOrNull
  3. Pembersihan dengan finally dan NonCancellable
  4. Propagasi Pembatalan dalam Hierarki Coroutine
← Kembali ke Kotlin Academy