Channel-Typen: Rendezvous, Buffered, Conflated, Unlimited
Wählen Sie den passenden Channel-Typ für Ihr Kommunikationsmuster aus.
Channel-Typen: Rendezvous, Buffered, Conflated, Unlimited ist eine kostenlose Kotlin Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Kotlin Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.
Channel-Factory
Erstellen Sie Channels mit Channel<T>(capacity). Die Kapazität bestimmt das Puffer- und Suspendierungsverhalten.
import kotlinx.coroutines.channels.Channel
val rendezvous = Channel<Int>() // capacity 0
val buffered = Channel<Int>(64) // capacity 64
val unlimited = Channel<Int>(Channel.UNLIMITED)
val conflated = Channel<Int>(Channel.CONFLATED)
fun main() { println("Channel types created") }Rendezvous-Channel (capacity=0)
Standard-Channel. send suspendiert, bis ein Empfänger bereit ist, und receive suspendiert, bis ein Sender sendet. Sie treffen sich an demselben Punkt.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val ch = Channel<Int>() // rendezvous
launch {
println("Sending...")
ch.send(1) // suspends until receiver is ready
println("Sent")
}
delay(100)
println("Receiving...")
println(ch.receive())
}Gepufferter Channel
Ein gepufferter Channel ermöglicht dem Sender, ohne Warten fortzufahren, bis der Puffer voll ist. Wenn der Puffer voll ist, suspendiert send.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val ch = Channel<Int>(3) // buffer of 3
launch {
repeat(3) {
println("Sending $it")
ch.send(it) // does not suspend until buffer full
}
ch.close()
}
delay(500)
for (v in ch) println("Got $v")
}Channel.BUFFERED
Channel.BUFFERED verwendet die Standardkapazität (64). Dies entspricht Channel(64).
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.*
fun main() = runBlocking {
val ch = Channel<String>(Channel.BUFFERED)
println("Default buffer capacity is implementation-defined (~64)")
ch.close()
}Unbegrenzter Channel
Channel.UNLIMITED suspendiert den Sender niemals — alle Werte werden gepuffert. Verwenden Sie dies mit Vorsicht: Ein unbegrenztes Speicherwachstum ist möglich.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val ch = Channel<Int>(Channel.UNLIMITED)
launch {
repeat(1000) { ch.send(it) } // never suspends
ch.close()
}
var sum = 0
for (v in ch) sum += v
println("Sum: $sum")
}Conflated Channel
Channel.CONFLATED behält nur den aktuellsten Wert. Wenn ein neuer Wert eintrifft, bevor der vorherige empfangen wurde, wird der alte verworfen.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val ch = Channel<Int>(Channel.CONFLATED)
launch {
repeat(5) { ch.send(it) } // 0..4 sent rapidly
ch.close()
}
delay(50) // let all sends happen
println("Received: ${ch.tryReceive().getOrNull()}") // likely 4 (last)
}Zeitverhalten von RENDEZVOUS und BUFFERED
Rendezvous synchronisiert Producer und Consumer. Buffered ermöglicht dem Producer, vorauszulaufen, und entkoppelt dadurch ihr Zeitverhalten.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val ch = Channel<Int>(Channel.BUFFERED)
val t = System.currentTimeMillis()
launch {
repeat(5) { ch.send(it) } // fast — doesn't wait
ch.close()
}
for (v in ch) { delay(100); println("$v at ${System.currentTimeMillis()-t}ms") }
}onBufferOverflow-Strategie
Mit Channel(capacity, onBufferOverflow) legen Sie fest, was geschieht, wenn der Puffer voll ist: SUSPEND (Standard), DROP_OLDEST oder DROP_LATEST.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val ch = Channel<Int>(2, BufferOverflow.DROP_OLDEST)
launch {
repeat(5) { ch.trySend(it) } // 0,1,2,3,4 — buffer keeps newest 2
ch.close()
}
for (v in ch) println(v) // likely 3 4
}Den richtigen Channel-Typ wählen
Entscheidungshilfe: Rendezvous für enge Synchronisierung; Buffered für hohen Durchsatz; Conflated nur für den aktuellsten Wert (z. B. einen UI-Zustand); Unlimited für die Ereignisprotokollierung, wenn Datenverluste nicht akzeptabel sind.
import kotlinx.coroutines.channels.Channel
// Use cases:
// RENDEZVOUS — handshake between producer and consumer
// BUFFERED — decouple I/O-heavy producer from slow consumer
// CONFLATED — UI updates (only latest matters)
// UNLIMITED — audit log (never drop)
fun main() { println("Choose based on your loss tolerance and timing needs") }Channel in select
select ermöglicht das gleichzeitige Warten auf mehrere Channels und verwendet denjenigen, der zuerst bereit ist.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
import kotlinx.coroutines.selects.*
fun main() = runBlocking {
val a = produce { delay(100); send("from a") }
val b = produce { delay(50); send("from b") }
val result = select<String> {
a.onReceive { it }
b.onReceive { it }
}
println(result) // "from b"
coroutineContext.cancelChildren()
}Ticker-Channel
ticker(delay) erstellt einen Channel, der alle delay Millisekunden Unit emittiert — nützlich für wiederholtes Polling.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val ticker = ticker(delayMillis = 100, initialDelayMillis = 0)
var count = 0
for (tick in ticker) {
println("Tick ${++count}")
if (count == 3) { ticker.cancel(); break }
}
}Kurzer Test
Welcher Channel-Typ behält nur den aktuellsten Wert?
Zusammenfassung
Rendezvous: synchronisiert, ohne Puffer. Buffered: entkoppelt das Zeitverhalten. Conflated: nur der aktuellste Wert, alte Werte werden verworfen. Unlimited: suspendiert den Sender niemals. Wählen Sie abhängig von Ihrer Toleranz gegenüber Datenverlusten und Ihren Anforderungen an den Durchsatz.
Lerne Kotlin mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 51
- Lektionen
- 203
Häufig gestellte Fragen
Ist die Lektion „Channel-Typen: Rendezvous, Buffered, Conflated, Unlimited“ kostenlos?
Ja — der vollständige Text von „Channel-Typen: Rendezvous, Buffered, Conflated, Unlimited“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Kotlin Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Channel-Typen: Rendezvous, Buffered, Conflated, Unlimited“?
Wählen Sie den passenden Channel-Typ für Ihr Kommunikationsmuster aus. Du übst Kotlin Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Kotlin Academy zu starten?
Keine Vorkenntnisse erforderlich. Kotlin Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „Channel-Typen: Rendezvous, Buffered, Conflated, Unlimited“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Kotlin Academy-Lektion Code schreiben und ausführen?
Ja. Jede Kotlin Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Channel-Grundlagen: send, receive und close
- Channel-Typen: Rendezvous, Buffered, Conflated, Unlimited
- Mutex und Semaphore für gemeinsam genutzten Zustand
- Actors und strukturierte Zustandsverwaltung