Channels
One way for two coroutines to communicate (or for a coroutine to the external world as with async) is throughDeferred<T>:
import kotlinx.coroutines.experimental.delay
import kotlinx.coroutines.experimental.launch
import kotlinx.coroutines.experimental.runBlocking
fun main(args: Array<String>) = runBlocking {
val result = CompletableDeferred<String>()
val world = launch {
delay(500)
result.complete("World (from another coroutine)")
}
val hello =launch {
println("Hello ${result.await()}")
}
hello.join()
world.join()
}Deferreds are fine for single values, but sometimes we want to send a sequence or a stream. In that case, we can use Channel. Channel which is similar to BlockingQueue, but with suspending operations instead of blocking ones, also Channel can be close:
import kotlinx.coroutines.experimental.channels.*
fun main(args: Array<String>) = runBlocking<Unit> {
val channel = Channel<String>()
...