| /* |
| * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. |
| */ |
| |
| // This file was automatically generated from coroutines-guide.md by Knit tool. Do not edit. |
| package kotlinx.coroutines.guide.channel10 |
| |
| import kotlinx.coroutines.* |
| import kotlinx.coroutines.channels.* |
| |
| fun main() = runBlocking<Unit> { |
| val tickerChannel = ticker(delayMillis = 100, initialDelayMillis = 0) // create ticker channel |
| var nextElement = withTimeoutOrNull(1) { tickerChannel.receive() } |
| println("Initial element is available immediately: $nextElement") // initial delay hasn't passed yet |
| |
| nextElement = withTimeoutOrNull(50) { tickerChannel.receive() } // all subsequent elements has 100ms delay |
| println("Next element is not ready in 50 ms: $nextElement") |
| |
| nextElement = withTimeoutOrNull(60) { tickerChannel.receive() } |
| println("Next element is ready in 100 ms: $nextElement") |
| |
| // Emulate large consumption delays |
| println("Consumer pauses for 150ms") |
| delay(150) |
| // Next element is available immediately |
| nextElement = withTimeoutOrNull(1) { tickerChannel.receive() } |
| println("Next element is available immediately after large consumer delay: $nextElement") |
| // Note that the pause between `receive` calls is taken into account and next element arrives faster |
| nextElement = withTimeoutOrNull(60) { tickerChannel.receive() } |
| println("Next element is ready in 50ms after consumer pause in 150ms: $nextElement") |
| |
| tickerChannel.cancel() // indicate that no more elements are needed |
| } |