为什么"重复"功能在kotlin中可以取消

时间:2018-06-04 08:30:26

标签: kotlin

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或使用挂起功能但可以取消

2 个答案:

答案 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