取消
fun main() = runBlocking{
val job = GlobalScope.launch {
repeat(200){
println(it)
delay(500)
}
}
delay(1000)
println("to cancel the job.")
job.cancel() // 取消job
job.join() // 必须 join。此句作用是挂起协程,直至 job 完成才会真正取消 job
println("... end")
}
程序执行到 1 秒时,job 被取消。因此打印结果为:
0
1
to cancel the job.
... end
cancel() 函数接受一个 CancellationException 参数,默认为 null。你可以用它来指定取消原因,例如:
job.cancel(CancellationException("just for test"))
但实际上kotlin 不会把 CancellationException 当成一种真正的异常,所以控制台没有任何打印。此外,由于 cancel 和 join 经常是成对出现的,所以 kotlin 也提供了一个函数同时支持二者的操作:
job.cancelAndJoin()
在 kotlinx.coroutines 包下有许多挂起函数,这些函数全部都是可取消的。它们会检查协程的 isActive 状态,当 此 状态为 true 时,抛出 CancellationException 异常。不过,如果协程正在执行,并且没有检查取消状态,那么它就无法被取消。
fun main() = runBlocking{
val startTime = System.currentTimeMillis()
val job = launch(Dispatchers.Default){
var nextPrintTime = startTime
var i = 0
while(i<20){
if(System.currentTimeMillis() >= next