我使用withContext变换函数为不阻止调用线程暂停功能。 为此,我使用https://medium.com/@elizarov/blocking-threads-suspending-coroutines-d33e11bf4761作为参考。
现在我想调用该函数超时。 为此,我使用withTimeout调用的函数这样:
@Test
internal fun timeout() {
runBlocking {
logger.info("launching")
try {
withTimeout(1000) {
execute()
}
} catch (e: TimeoutCancellationException) {
logger.info("timed out", e)
}
}
}
private suspend fun execute() {
withContext(Dispatchers.IO) {
logger.info("sleeping")
Thread.sleep(2000)
}
}
所以,我会想到的是,在1000个米利斯异步启动协同程序被取消,TimeoutCancellationException被抛出。
但是,什么情况是,完整的2000米利斯传递并在完成协程时抛出异常:
14:46:29.231 [主@协程#1] INFO btccCoroutineControllerTest - 发射
14:46:29.250 [DefaultDispatcher工-1 @协程#1] INFO btccCoroutineControllerTest - 睡眠
14:46:31.261 [主@协程#1] INFO btccCoroutineControllerTest - 超时kotlinx.coroutines.TimeoutCancellationException:超时在kotlinx.coroutines.TimeoutKt.TimeoutCancellationException(Timeout.kt:128)等待1000毫秒在kotlinx.coroutines.TimeoutCoroutine .RUN(Timeout.kt:94)在kotlinx.coroutines.EventLoopImplBase $ DelayedRunnableTask.run(EventLoop.kt:307)在kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.kt:116)在kotlinx.coroutines.DefaultExecutor.run( DefaultExecutor.kt:68)在java.lang.Thread.run(Thread.java:748)
我使用的是什么问题?
或许这是预期的行为? 在文档中的计数器也得到2,这意味着协程被取消之前1500个米利斯已经过去了: https://github.com/Kotlin/kotlinx.coroutines/blob/master/docs/cancellation-and-timeouts.md#timeout