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