kotlin 取消和超时

//1.协程取消执行
fun mainCancel() = runBlocking {
    var job = launch {
        repeat(20) { i ->
            println("$i")
            delay(1000)
        }
    }
    delay(1100)
    println("delay ...")
    cancelAndJoin(job)
    println("end")
}
private suspend fun cancelAndJoin(job: Job) {//重构
    job.cancel() //取消执行协程
    job.join() //等待协程
}
//2.要协程操作完成后,协程才可以取消
fun main_cancel() = runBlocking {
    val startTime = System.currentTimeMillis()   //获取系统时间
    val job = launch(Dispatchers.Default) {
        var nextTime = startTime
        var i = 0
        while (i < 5) {
            if (System.currentTimeMillis() >= nextTime) {//防并发
                println("${i++}")
                nextTime += 1000
            }
        }
    }
    delay(1000)
    println("main:")
    job.cancelAndJoin()//先进入循环操作,后执行取消协程(协程不是立即执行的,因为循环还在运行中)
    println("end:")
}

//3.想在操作中,取消协程 在操作中加判断
fun main_isActive() = runBlocking {
    val startTime = System.currentTimeMillis()   //获取系统时间
    val job = launch(Dispatchers.Default) {
        var nextTime = startTime
        var i = 0
        while (isActive) {//判断是否活跃
            if (System.currentTimeMillis() >= nextTime) {//防并发
                println("${i++}")
                nextTime += 1000
            }
        }
    }
    delay(1000)
    println("main:")
    job.cancelAndJoin()//先进入循环操作,后执行取消协程(协程不是立即执行的,因为循环还在运行中)
    println("end:")
}

//4.关闭资源 finally 。withContext(NonCancellable)里面取消不了
fun main_finally() = runBlocking {
    val job = launch() {
        try {
            repeat(10000) { i ->
                println("$i")
                delay(1000)
            }
        } finally {//关闭资源
            println("finally...")
            withContext(NonCancellable) {
                delay(1000L)
                println("delay...end")//取消不了 在withContext(NonCancellable)代码块里
            }
        }
    }
    delay(1000)
    println("main:")
    job.cancelAndJoin()//先进入循环操作,后执行取消协程(协程不是立即执行的,因为循环还在运行中)
    println("end:")
}

//5.操作超时
fun main_withTimeoutOrNull() = runBlocking {
    val job = withTimeoutOrNull(1200) {//用withTimeout会报异常
        repeat(1000) { i ->
            println("$i")
            delay(1000)
        }
    }
    delay(1000)
    println("end:")
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值