Pembatalan Kooperatif: isActive dan ensureActive
Buat coroutine yang dapat dibatalkan dengan memeriksa isActive dan memanggil ensureActive.
Pembatalan Kooperatif: isActive dan ensureActive adalah pelajaran Kotlin Academy gratis di CoddyKit. Ini adalah pelajaran 1 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.
Mengapa Pembatalan Kooperatif
Coroutine Kotlin menggunakan pembatalan kooperatif: coroutine yang dibatalkan hanya dihentikan saat bekerja sama dengan memeriksa status pembatalannya. Perulangan CPU yang ketat tidak akan berhenti sampai melakukan pemeriksaan.
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")
}Memeriksa isActive
isActive adalah properti pada CoroutineScope yang mengembalikan false setelah pembatalan diminta. Memeriksanya dalam perulangan membuat coroutine bekerja sama.
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() melempar CancellationException jika coroutine dibatalkan. Ini merupakan pengganti langsung untuk 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() sebagai Titik Kooperatif
yield() menangguhkan coroutine sejenak sehingga penjadwal dapat memeriksa pembatalan dan menjalankan coroutine lain.
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 vs ensureActive
Gunakan isActive untuk logika kondisional, misalnya keluar dari perulangan dengan baik. Gunakan ensureActive() saat Anda ingin segera meneruskan pembatalan sebagai pengecualian.
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 Bersifat Khusus
CancellationException tidak diteruskan ke induk—pengecualian ini menandakan pembatalan normal. Jangan pernah menelannya; selalu lempar ulang atau biarkan pengecualian tersebut diteruskan.
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}")
}Pekerjaan yang Terikat CPU
Untuk pekerjaan yang terikat CPU, sisipkan ensureActive() atau yield() pada titik pemeriksaan yang alami agar pembatalan dapat berlangsung tepat waktu.
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 dalam Fungsi Penangguhan Kustom
Anda dapat mengakses isActive di dalam fungsi penangguhan apa pun melalui coroutineContext.isActive atau dengan menggunakan 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()
}Pembatalan dengan Pembersihan Sumber Daya
Bahkan dengan pembatalan kooperatif, sumber daya dapat dibersihkan di dalam blok finally—pengecualian pembatalan tetap merambat melewatinya.
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()
}Pemeriksaan Berkala dengan isActive
Perulangan pemeriksaan berkala sangat cocok untuk isActive: terus lakukan pemeriksaan sampai korutin dibatalkan.
import kotlinx.coroutines.*
fun main() = runBlocking {
val job = launch {
while (isActive) {
println("Polling...")
delay(100)
}
println("Poller stopped")
}
delay(350)
job.cancel()
job.join()
}Perbedaan dari Thread.interrupted()
Tidak seperti utas Java, korutin Kotlin tidak bergantung pada tanda interupsi. Pembatalan dimodelkan melalui pengecualian dan status cakupan, sehingga dapat dikomposisikan dan terstruktur.
import kotlinx.coroutines.*
fun main() = runBlocking {
// Kotlin way: cooperative via isActive / ensureActive
launch {
ensureActive()
println("Kotlin coroutine: cancellation is explicit and structured")
}
}Pemeriksaan Singkat
Fungsi apa yang langsung melempar pengecualian ketika korutin dibatalkan?
Ringkasan
Pembatalan kooperatif memerlukan titik pemeriksaan yang eksplisit: isActive untuk keluar secara bersyarat, ensureActive() untuk langsung melempar pengecualian, dan menyerahkan kendali untuk menangguhkan eksekusi serta melepaskan utas. Jangan pernah menelan CancellationException.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pembatalan Kooperatif: isActive dan ensureActive” gratis?
Ya — teks lengkap “Pembatalan Kooperatif: isActive dan ensureActive” 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 “Pembatalan Kooperatif: isActive dan ensureActive”?
Buat coroutine yang dapat dibatalkan dengan memeriksa isActive dan memanggil ensureActive. 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 1 dari 4.
Berapa lama pelajaran “Pembatalan Kooperatif: isActive dan ensureActive” 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
- Pembatalan Kooperatif: isActive dan ensureActive
- withTimeout dan withTimeoutOrNull
- Pembersihan dengan finally dan NonCancellable
- Propagasi Pembatalan dalam Hierarki Coroutine