Dasar Channel: send, receive, dan close
Buat channel, kirim dan terima nilai, lalu tutup dengan benar.
Dasar Channel: send, receive, dan close 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.
Apa Itu Kanal?
Channel adalah primitif coroutine untuk berkomunikasi antarcoroutine — seperti antrean yang memblokir, tetapi ditangguhkan. Anggaplah ini sebagai pipa: satu sisi mengirim, sisi lainnya menerima.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val channel = Channel<Int>()
launch {
for (i in 1..5) channel.send(i)
channel.close()
}
for (x in channel) println(x) // 1 2 3 4 5
}send dan receive
send(value) ditangguhkan sampai penerima siap. receive() ditangguhkan sampai sebuah nilai tersedia.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val ch = Channel<String>()
launch {
ch.send("ping")
println("sent")
}
val msg = ch.receive()
println("received: $msg")
}Menutup Kanal
channel.close() menandakan bahwa tidak ada lagi nilai yang akan dikirim. Penerima mendapatkan nilai yang masih tersangga, lalu perulangan berakhir.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val ch = Channel<Int>(3)
launch {
repeat(3) { ch.send(it) }
ch.close() // signal done
}
for (v in ch) println(v) // 0 1 2, then loop ends
println("Channel consumed")
}isClosedForSend / isClosedForReceive
Periksa status kanal dengan isClosedForSend, yang berarti tidak ada pengiriman lagi yang diizinkan, dan isClosedForReceive, yang berarti semua nilai telah dikonsumsi.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val ch = Channel<Int>()
launch {
ch.send(1)
ch.close()
}
println(ch.receive())
println("isClosedForReceive: ${ch.isClosedForReceive}")
}Pembuat produce
produce { } adalah pembuat coroutine yang membuat coroutine produsen dan mengembalikan ReceiveChannel. Kanal ditutup secara otomatis saat blok berakhir.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun CoroutineScope.squares(n: Int) = produce<Int> {
for (i in 1..n) send(i * i)
}
fun main() = runBlocking {
val sq = squares(5)
for (v in sq) println(v) // 1 4 9 16 25
}Ekstensi consumeEach
consumeEach { } melakukan iterasi pada kanal dan membatalkannya jika blok menimbulkan pengecualian, sehingga mencegah kebocoran.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val ch = produce<String> {
send("a"); send("b"); send("c")
}
ch.consumeEach { println(it) }
}tryReceive dan trySend
Alternatif yang tidak menangguhkan: trySend / tryReceive segera mengembalikan ChannelResult tanpa menangguhkan.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val ch = Channel<Int>(1)
val sendResult = ch.trySend(42)
println("Sent: ${sendResult.isSuccess}")
val recvResult = ch.tryReceive()
println("Got: ${recvResult.getOrNull()}")
}Percabangan Keluar: Banyak Konsumen
Beberapa coroutine dapat menerima dari kanal yang sama dan membagi pekerjaan — ini adalah pola percabangan keluar.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val tasks = produce { repeat(6) { send(it) } }
repeat(3) { worker ->
launch {
for (task in tasks) {
println("Worker $worker: task $task")
}
}
}
}Penggabungan Masuk: Banyak Produsen
Beberapa coroutine dapat mengirim ke kanal yang sama dan menggabungkan keluarannya — ini adalah pola penggabungan masuk.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val results = Channel<String>()
repeat(3) { i ->
launch { results.send("result-$i") }
}
launch {
repeat(3) { println(results.receive()) }
results.close()
}
}Pola Alur Pemrosesan
Rangkai kanal menjadi alur pemrosesan, dengan setiap tahap membaca dari satu kanal dan menulis ke kanal lainnya — sangat baik untuk alur kerja pemrosesan data.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun CoroutineScope.numbers() = produce { for (i in 1..5) send(i) }
fun CoroutineScope.doubled(input: ReceiveChannel<Int>) = produce { for (v in input) send(v * 2) }
fun main() = runBlocking {
val nums = numbers()
val doubled = doubled(nums)
for (v in doubled) println(v) // 2 4 6 8 10
coroutineContext.cancelChildren()
}Kanal vs Alur
Kanal bersifat panas dan memiliki status — kanal tetap ada secara independen dari konsumsi. Alur bersifat dingin dan deklaratif — alur dimulai ulang pada setiap pengumpulan. Utamakan Flow untuk aliran data; gunakan Kanal untuk komunikasi produsen-konsumen.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
import kotlinx.coroutines.flow.*
// Flow (cold): each collect() re-runs the block
// Channel (hot): shared; multiple receivers share the same stream
fun main() = runBlocking { println("Flow = cold; Channel = hot") }Pemeriksaan Singkat
Apa yang terjadi saat Anda memanggil channel.close()?
Ringkasan
send dan receive ditangguhkan hingga sisi lainnya siap. close() menandakan penyelesaian. Gunakan produce untuk produsen yang menutup dirinya sendiri, consumeEach untuk iterasi yang aman, dan kanal untuk pola percabangan keluar/penggabungan masuk.
Belajar Kotlin dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Dasar Channel: send, receive, dan close” gratis?
Ya — teks lengkap “Dasar Channel: send, receive, dan close” 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 “Dasar Channel: send, receive, dan close”?
Buat channel, kirim dan terima nilai, lalu tutup dengan benar. 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 “Dasar Channel: send, receive, dan close” 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
- Dasar Channel: send, receive, dan close
- Tipe Channel: Rendezvous, Buffered, Conflated, Unlimited
- Mutex dan Semaphore untuk Status Bersama
- Actor dan Pengelolaan Status Terstruktur