kotlin - 为什么 “repeat”函数在kotlin中可以取消

标签 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或使用暂停功能,但可以取消

最佳答案

这是与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

关于kotlin - 为什么 “repeat”函数在kotlin中可以取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50676327/

相关文章:

kotlin - 为什么专家将 MutableList 更改为 List?

reflection - Kotlin:如何访问委托(delegate)的 get- 和 setValue 方法?

android - 膨胀类 android.support.v7.widget.CardView ClassNotFoundException 时出错

android - 使用 Kotlin 在 Android 10 上对标记进行聚类

android - 为什么使用WorkManager的OneTimeWorkRequest的setInitialDelay()函数,改变设备时间时延迟不生效

generics - Kotlin:返回一个通用接口(interface)

list - 如何从非流函数获取流输出

kotlin - 如何将自动生成的ID添加到Cloud Firestore数据库

java - 如何减小 Tflite 模型的大小或下载并以编程方式设置?

spring - Noarg构造函数未创建