You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kotlin协程取消后继续执行任务?

协程取消后执行后续任务的最优方案

协程取消的核心是可取消挂起函数(如delay)会在协程取消时抛出CancellationException,要实现取消后继续执行后续任务,不用Thread.sleep的话,最优方案是利用try-finally配合NonCancellable上下文:

  1. 用try包裹主任务逻辑,在finally块中编写取消后需要执行的后续代码
  2. 如果后续代码包含挂起操作(比如再次调用delay),必须用withContext(NonCancellable)包裹——因为协程取消后默认无法执行挂起操作,NonCancellable会让这段代码不受取消状态影响

示例代码

import kotlinx.coroutines.*

fun main() = runBlocking {
    val job = launch {
        try {
            println("主任务执行中...")
            delay(1000) // 可取消挂起点,协程取消时会在此抛出异常
            println("主任务正常完成") // 协程被取消的话这行不会执行
        } finally {
            println("开始执行取消后的后续任务")
            // 若后续任务需要挂起,必须用NonCancellable上下文
            withContext(NonCancellable) {
                println("后续任务包含挂起操作,执行delay...")
                delay(500) // 这里的挂起不受协程取消影响
                println("取消后的后续任务执行完毕")
            }
        }
    }

    delay(500) // 等待主任务执行一段时间后取消
    job.cancel()
    println("已发起协程取消请求")
}

方案优势

  • 完全基于协程框架实现,避免了Thread.sleep阻塞线程的资源浪费问题
  • 精准控制取消后代码的执行范围,挂起操作也能正常运行
  • 符合协程的非阻塞设计理念,保持代码的异步特性

内容的提问来源于stack exchange,提问作者EBRAHIM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 15:27:07