【深入kotlin】 - 协程的取消

本文深入探讨了Kotlin协程的取消机制,包括取消、异常取消和超时情况。示例代码展示了如何通过调用cancel()和join(),以及使用withTimeout()函数实现超时取消。文章还强调了资源清理的重要性,说明了如何在finally块中正确处理挂起函数以确保清理操作的执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

取消
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值