gregschlom
06/07/2017, 9:45 PMval channel = Channel<Int>()
// this blocks indefinitely if the channel is empty
suspend fun nexValue(): Int {
println("Waiting for next value ")
return channel.receive()
}
// same as nextValue(), but returns null after the timeout expires
suspend fun nextValueWithTimout(t: Long): Int? {
return withTimeoutOrNull(t) { nexValue() }
}
suspend fun longOperation() {
println("Starting long operation")
while (true) {
val v = nextValueWithTimout(1000)
if (v == null) {
println("timed out")
// Nothing was received in our channel.
// Do some other work while we wait for the value to arrive. Maybe we want to re-try sending
// a message to our value producer for example
}
if (v == 42) return
}
}
@Test
fun main() = runBlocking {
// This never returns. Instead we get stuck in an infinite loop in the while() above
withTimeout(5000) {
longOperation()
}
}