为什么;重复;函数在kotlin中是可取消的 fun main(args:Array)=运行阻塞{ val作业=启动{ 重复(1000){i-> println(“我睡了$I…”) 延迟(500L) } } 延迟(1300L)//延迟一点 println(“梅因:我等烦了!”) job.cancel()//取消作业 job.join()//等待作业完成 println(“main:现在我可以退出了。”)
} 此代码未选中“激活”或“使用挂起功能”,但可以取消,因为为什么;重复;函数在kotlin中是可取消的 fun main(args:Array)=运行阻塞{ val作业=启动{ 重复(1000){i-> println(“我睡了$I…”) 延迟(500L) } } 延迟(1300L)//延迟一点 println(“梅因:我等烦了!”) job.cancel()//取消作业 job.join()//等待作业完成 println(“main:现在我可以退出了。”),kotlin,Kotlin,} 此代码未选中“激活”或“使用挂起功能”,但可以取消,因为delay()是挂起功能 Thread.sleep()不是挂起函数。 如果将delay(500L)替换为Thread.sleep(500),则它将无法按时取消。,因为delay()是一个挂起函数 Thread.sleep()不是挂起函数。 如果用线程睡眠(500)替换延迟(500L),那么它将无法按时取消。以下是Java线程的类比: 1) 明确检查中断标志: fun main(args: Array<String>) = r
delay()
是挂起功能
Thread.sleep()
不是挂起函数。
如果将delay(500L)
替换为Thread.sleep(500)
,则它将无法按时取消。,因为delay()
是一个挂起函数
Thread.sleep()
不是挂起函数。
如果用
线程睡眠(500)
替换延迟(500L)
,那么它将无法按时取消。以下是Java线程的类比:
1) 明确检查中断标志:
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.")
2) 调用可中断操作:
while (!Thread.interrupted()) {
// loop code
}
在这两种情况下,线程都将响应提升的中断标志
在协同程序中,delay()
是Thread.sleep()
的对应项,isActive
标志是Thread.interrupted
标志的对应项
所以你写的时候,
while (true) {
Thread.sleep(1);
// loop code
}
协同程序将被安排在线程外,当其恢复时间到来时,在
continuation.resume()调用中,它将首先检查isActive
标志。如果引发,它将抛出一个CancellationException
。以下是与Java线程的类比:
1) 明确检查中断标志:
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.")
2) 调用可中断操作:
while (!Thread.interrupted()) {
// loop code
}
在这两种情况下,线程都将响应提升的中断标志
在协同程序中,delay()
是Thread.sleep()
的对应项,isActive
标志是Thread.interrupted
标志的对应项
所以你写的时候,
while (true) {
Thread.sleep(1);
// loop code
}
协同程序将被安排在线程外,当其恢复时间到来时,在continuation.resume()调用中,它将首先检查isActive
标志。如果引发,它将抛出一个CancellationException