fun main(args: Array<String>) = runBlocking<Unit> {
val job = launch {
repeat(1000) { i ->
println("I'm sleeping $i ...")
delay(500L)
}
}
delay(1300L) // delay a bit
println("main: I'm tired of waiting!")
job.cancel() // cancels the job
job.join() // waits for job's completion
println("main: Now I can quit.")
} 此代码不检查isActive或使用挂起功能但可以取消
答案 0 :(得分:2)
因为delay()
是暂停功能。
Thread.sleep()
不是暂停功能。
如果您将delay(500L)
替换为Thread.sleep(500)
,则它将无法按时取消。
答案 1 :(得分:2)
这是与Java线程的类比:
1)明确检查中断标志:
while (!Thread.interrupted()) {
// loop code
}
2)调用可中断的操作:
while (true) {
Thread.sleep(1);
// loop code
}
在这两种情况下,线程都会响应一个引发的中断标志。
在协同程序中,delay()
是Thread.sleep()
的对应部分,isActive
标志是Thread.interrupted
标志的对应部分。
因此,当你写
delay(1)
协程将被安排在线程之外,当其恢复时间到来时,在continuation.resume()
调用内,它将首先检查isActive
标志。如果它被提出,则会抛出CancellationException
。