Channel Synchronization in Kotlin
In Kotlin, we can use coroutines to achieve similar functionality to Go’s goroutines for concurrent execution. Here’s an example of using a channel (implemented as a Channel from kotlinx.coroutines) to synchronize execution across coroutines:
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel
// This is the function we'll run in a coroutine. The
// `done` channel will be used to notify another
// coroutine that this function's work is done.
suspend fun worker(done: Channel<Boolean>) {
print("working...")
delay(1000) // Simulate work
println("done")
// Send a value to notify that we're done.
done.send(true)
}
fun main() = runBlocking {
// Start a worker coroutine, giving it the channel to
// notify on.
val done = Channel<Boolean>()
launch { worker(done) }
// Block until we receive a notification from the
// worker on the channel.
done.receive()
}To run this program:
$ kotlinc -cp kotlinx-coroutines-core-1.5.2.jar channel-synchronization.kt -include-runtime -d channel-synchronization.jar
$ java -jar channel-synchronization.jar
working...doneIn this Kotlin version:
We use
suspend funto define ourworkerfunction, which can be suspended and resumed.Instead of Go’s
time.Sleep, we use Kotlin’sdelayfunction for suspending the coroutine.We create a
Channel<Boolean>instead of a Go channel.The
gokeyword is replaced by launching a new coroutine withlaunch { ... }.The main function is wrapped in
runBlocking, which creates a coroutine and blocks the current thread until all launched coroutines complete.We use
done.send(true)to send a value to the channel anddone.receive()to receive from it.
If you removed the done.receive() line from this program, the program would exit before the worker even started, similar to the Go version.
Note: This example requires the kotlinx-coroutines-core library. Make sure to include it in your project dependencies.