Kotlin Academy · Ders

İş Birlikli İptal: isActive ve ensureActive

isActive denetimi yapıp ensureActive çağırarak koroutinleri iptal edilebilir hâle getirin.

1. ders / 413 adım

İş Birlikli İptal: isActive ve ensureActive, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Kotlin Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Kotlin Academy kursu toplamda 4 dersten oluşur.

İşbirlikçi İptal Neden Gerekli

Kotlin eş yordamları işbirlikçi iptal kullanır: İptal edilen bir eş yordam, yalnızca iptal durumunu denetleyerek işbirliği yaptığında durdurulur. Sıkı bir CPU döngüsü, denetim yapana kadar durmaz.

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")
}

isActive Denetimi

isActive, iptal istendiğinde false döndüren bir CoroutineScope özelliğidir. Bir döngüde bunu denetlemek, eş yordamın işbirliği yapmasını sağlar.

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(), eş yordam iptal edilmişse CancellationException fırlatır. if (!isActive) throw CancellationException() ifadesinin doğrudan kullanılabilen karşılığıdır.

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()
}

İşbirlikçi Nokta Olarak yield()

yield(), eş yordamı kısa süreliğine askıya alır; böylece zamanlayıcı iptali denetleyebilir ve diğer eş yordamları çalıştırabilir.

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 ve ensureActive Karşılaştırması

Koşullu mantık için isActive kullanın (örneğin bir döngüden kontrollü biçimde çıkmak için). İptali hemen bir istisna olarak yaymak istediğinizde ensureActive() kullanın.

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 Özeldir

CancellationException üst öğeye yayılmaz — normal iptali bildirir. Bunu asla yutmayın; her zaman yeniden fırlatın veya yayılmasına izin verin.

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}")
}

CPU'ya Bağlı Çalışmalarda İptal

CPU'ya bağlı çalışmalarda, zamanında iptale izin vermek için doğal kontrol noktalarına ensureActive() veya yield() ekleyin.

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()
}

Özel Askıya Alınabilir Fonksiyonda isActive

isActive değerine herhangi bir askıya alınabilir fonksiyonun içinde coroutineContext.isActive aracılığıyla veya currentCoroutineContext().isActive kullanarak erişebilirsiniz.

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()
}

Kaynakların Temizlenmesiyle İptal

İşbirlikçi iptal kullanılsa bile kaynaklar finally bloklarında temizlenebilir — iptal istisnası bu bloklardan geçerek yayılmaya devam eder.

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()
}

isActive ile Yoklama

Yoklama döngüleri isActive için mükemmel bir kullanım alanıdır: korutin iptal edilene kadar yoklamayı sürdürün.

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

Thread.interrupted() ile Farkı

Java iş parçacıklarının aksine, Kotlin korutinleri kesme bayraklarına dayanmaz. İptal, istisnalar ve kapsam durumu aracılığıyla modellenir; bu da onu bileştirilebilir ve yapılandırılmış hâle getirir.

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

Hızlı Kontrol

Bir korutin iptal edildiğinde hangi fonksiyon hemen istisna fırlatır?

Özet

İşbirlikçi iptal açık kontrol noktaları gerektirir: koşullu çıkış için isActive, hemen istisna fırlatmak için ensureActive(), askıya alıp iş parçacığını serbest bırakmak için yield(). CancellationException istisnasını asla yutmayın.

Başlamak ücretsiz

Yapay zeka eğitmeniyle Kotlin öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
51
Dersler
203

Sıkça Sorulan Sorular

“İş Birlikli İptal: isActive ve ensureActive” dersi ücretsiz mi?

Evet — “İş Birlikli İptal: isActive ve ensureActive” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Kotlin Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Kotlin Academy kursu toplamda 4 dersten oluşur.

“İş Birlikli İptal: isActive ve ensureActive” dersinde ne öğreneceğim?

isActive denetimi yapıp ensureActive çağırarak koroutinleri iptal edilebilir hâle getirin. Kotlin Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Kotlin Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Kotlin Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“İş Birlikli İptal: isActive ve ensureActive” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Kotlin Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Kotlin Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. İş Birlikli İptal: isActive ve ensureActive
  2. withTimeout ve withTimeoutOrNull
  3. finally ve NonCancellable ile Temizleme
  4. Koroutin Hiyerarşilerinde İptal Yayılımı
← Kotlin Academy Sayfasına Dön