Kotlin入门教程指南 | Kotlin协程取消与超时

取消

我们可以启动协程,也可以在协程尚未结束时,主动取消协程。

例如在Android应用中,一个界面的ViewModel启动了协程,而这个界面要关闭退出了。那么我们需要把协程也取消掉。

launch函数返回的Job即是协程对象。调用job.cancel()函数即可取消协程。

import kotlinx.coroutines.*

fun main() = runBlocking {
   
    val job = GlobalScope.launch {
   
        repeat(100) {
    i ->
            println("休眠次数 $i")
            delay(500)
        }
    }
    val t1 = System.currentTimeMillis()
    delay(1200)
    println("[rustfisher] 等待完毕准备退出 t1:$t1")
    job.cancel()
    job.join()
    println("Bye~ 耗时: ${
     System.currentTimeMillis() - t1}毫秒")
}

运行结果

休眠次数 0
休眠次数 1
休眠次数 2
[rustfisher] 等待完毕准备退出 t1:1632750920587
Bye~ 耗时: 1218毫秒

调用job.cancel(),通过log可以看出在它没有输出了,因为它被取消了。

我们也可以调用JobcancelAndJoin()方法来代替上面代码中的cancel()join()

// Job.kt 部分源码
public suspend fun Job.cancelAndJoin() {
   
    cancel()
    return join()
}
检查取消情况

协程在协作的情况下才能被取消。kotlinx.coroutines中的挂起函数都是可被取消的。

无法取消

如果协程在执行计算任务,并且没检查取消的话,那我们的取消尝试会失败。比如下面的代码

import kotlinx.coroutines.*

fun main() = runBlocking {
   
    val startTime = System.currentTimeMillis()
    val job = launch(Dispatchers.Default) {
   
        var nextPrintTime = startTime
        var i = 0 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值