Kotlin Academy · leksjon

Kooperativ kansellering: isActive og ensureActive

Gjør coroutines kansellerbare ved å kontrollere isActive og kalle ensureActive.

Leksjon 1 av 413 trinn

Kooperativ kansellering: isActive og ensureActive er en gratis leksjon i Kotlin Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Kotlin Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Kotlin Academy inneholder totalt 4 leksjoner.

Hvorfor kooperativ kansellering?

Kotlin-korutiner bruker kooperativ kansellering: En kansellert korutine stoppes først når den samarbeider ved å kontrollere kanselleringstilstanden. En tett CPU-løkke stopper ikke før den utfører en slik kontroll.

import kotlinx.coroutines.*
fun main() = runBlocking {
    val job = launch {
        var i = 0
        while (true) { i++ } // never checks — never cancels!
    }
    delay(100)
    job.cancel()
    println("cancel sent but loop kept running until process ended")
}

Kontrollere isActive

isActive er en egenskap på CoroutineScope som returnerer false når kansellering er forespurt. Ved å kontrollere den i en løkke samarbeider korutinen.

import kotlinx.coroutines.*
fun main() = runBlocking {
    val job = launch {
        var i = 0
        while (isActive) {
            i++
        }
        println("Loop exited after $i iterations")
    }
    delay(10)
    job.cancel()
    job.join()
}

ensureActive()

ensureActive() utløser CancellationException hvis korutinen er kansellert. Den er en direkte erstatning for if (!isActive) throw CancellationException().

import kotlinx.coroutines.*
fun main() = runBlocking {
    val job = launch {
        try {
            repeat(1_000_000) {
                ensureActive()  // throws if cancelled
                // heavy computation here
            }
        } catch (e: CancellationException) {
            println("Cancelled at iteration")
            throw e
        }
    }
    delay(5)
    job.cancel()
    job.join()
}

yield() som kooperativt punkt

yield() suspenderer korutinen en kort stund, slik at planleggeren kan kontrollere kansellering og kjøre andre korutiner.

import kotlinx.coroutines.*
fun main() = runBlocking {
    val job = launch {
        repeat(10) { i ->
            yield()  // cooperative cancellation point + gives up scheduler
            println("Step $i")
        }
    }
    delay(2)
    job.cancel()
    job.join()
    println("Done")
}

isActive kontra ensureActive

Bruk isActive til betinget logikk, for eksempel for å avslutte en løkke på en kontrollert måte. Bruk ensureActive() når De vil videreføre kansellering som et unntak umiddelbart.

import kotlinx.coroutines.*
fun main() = runBlocking {
    launch {
        repeat(100) { i ->
            if (!isActive) {
                println("Stopping at $i, cleaning up...")
                return@launch
            }
            // work
        }
    }.also { delay(5); it.cancel(); it.join() }
}

CancellationException er et særtilfelle

CancellationException videreføres ikke til forelderen – det signaliserer normal kansellering. Ikke undertrykk det; kast det alltid på nytt eller la det videreføres.

import kotlinx.coroutines.*
fun main() = runBlocking {
    val job = launch {
        try {
            delay(1000)
        } catch (e: CancellationException) {
            println("Caught cancellation, rethrowing")
            throw e  // important!
        }
    }
    delay(50)
    job.cancel()
    job.join()
    println("Job state: ${job.isCancelled}")
}

Kansellering i CPU-bundet arbeid

For CPU-bundet arbeid bør du sette inn ensureActive() eller yield() ved naturlige kontrollpunkter, slik at kansellering kan skje raskt.

import kotlinx.coroutines.*
suspend fun heavyCompute(n: Int): Long {
    var result = 0L
    for (i in 0..n) {
        ensureActive()
        result += i
    }
    return result
}
fun main() = runBlocking {
    val job = launch(Dispatchers.Default) {
        println(heavyCompute(1_000_000))
    }
    delay(10)
    job.cancel()
    job.join()
}

isActive i en egendefinert suspend-funksjon

Du kan få tilgang til isActive i enhver suspend-funksjon via coroutineContext.isActive eller ved å bruke currentCoroutineContext().isActive.

import kotlinx.coroutines.*
suspend fun checkable() {
    while (currentCoroutineContext().isActive) {
        delay(10)
        println("tick")
    }
}
fun main() = runBlocking {
    val job = launch { checkable() }
    delay(35)
    job.cancel()
    job.join()
}

Kansellering med ressursopprydding

Selv ved kooperativ kansellering kan ressurser ryddes opp i finally-blokker – kanselleringsunntaket videreføres fortsatt gjennom dem.

import kotlinx.coroutines.*
fun main() = runBlocking {
    val job = launch {
        try {
            repeat(100) { i ->
                ensureActive()
                delay(20)
                println("Working $i")
            }
        } finally {
            println("Cleanup done")
        }
    }
    delay(50)
    job.cancel()
    job.join()
}

Polling med isActive

Polling-løkker passer perfekt med isActive: fortsett å polle til korutinen blir kansellert.

import kotlinx.coroutines.*
fun main() = runBlocking {
    val job = launch {
        while (isActive) {
            println("Polling...")
            delay(100)
        }
        println("Poller stopped")
    }
    delay(350)
    job.cancel()
    job.join()
}

Forskjellen fra Thread.interrupted()

I motsetning til Java-tråder er Kotlin-korutiner ikke avhengige av avbruddsflagg. Kansellering modelleres ved hjelp av unntak og tilstanden til et scope, noe som gjør den komponerbar og strukturert.

import kotlinx.coroutines.*
fun main() = runBlocking {
    // Kotlin way: cooperative via isActive / ensureActive
    launch {
        ensureActive()
        println("Kotlin coroutine: cancellation is explicit and structured")
    }
}

Kort kontroll

Hvilken funksjon kaster umiddelbart når en korutine kanselleres?

Oppsummering

Kooperativ kansellering krever eksplisitte kontrollpunkter: isActive for betinget avslutning, ensureActive() for å kaste umiddelbart og yield() for å suspendere og gi fra seg tråden. Undertrykk aldri CancellationException.

Gratis å komme i gang

Lær deg Kotlin med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
51
Leksjoner
203

Ofte stilte spørsmål

Er leksjonen «Kooperativ kansellering: isActive og ensureActive» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Kotlin Academy, inkludert «Kooperativ kansellering: isActive og ensureActive», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Kotlin Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Kooperativ kansellering: isActive og ensureActive»?

Gjør coroutines kansellerbare ved å kontrollere isActive og kalle ensureActive. Du øver på Kotlin Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Kotlin Academy?

Ingen tidligere erfaring er nødvendig. Kotlin Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «Kooperativ kansellering: isActive og ensureActive»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Kotlin Academy-leksjonen?

Ja. Alle Kotlin Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Kooperativ kansellering: isActive og ensureActive
  2. withTimeout og withTimeoutOrNull
  3. Rydde opp med finally og NonCancellable
  4. Kanselleringsforplantning i coroutine-hierarkier
← Tilbake til Kotlin Academy