Kotlin协程cancel取消正在运行的并行Job

Kotlin协程cancel取消正在运行的并行Job

Kotlin 复制代码
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.IO
import kotlinx.coroutines.async
import kotlinx.coroutines.delay
import kotlinx.coroutines.ensureActive
import kotlinx.coroutines.isActive
import kotlinx.coroutines.runBlocking


fun main() {
    runBlocking {
        val job1 = async(Dispatchers.IO) {
            repeat(Int.MAX_VALUE) {
                println("job1 $it")
            }
        }

        val job2 = async(Dispatchers.IO) {
            repeat(Int.MAX_VALUE) {
                delay(1)

                println("job2 $it")
            }
        }

        val job3 = async(Dispatchers.IO) {
            repeat(Int.MAX_VALUE) {
                this.ensureActive()

                println("job3 $it")
            }
        }

        val job4 = async(Dispatchers.IO) {
            repeat(Int.MAX_VALUE) {
                if (this.isActive) {
                    println("job4 $it")
                } else {
                    println("job4 cancel")
                }
            }
        }

        async(Dispatchers.IO) {
            delay(10)

            job1.cancel()
            job2.cancel()
            job3.cancel()
            job4.cancel()
        }
    }
}

代码运行起来后,job1和job4一致重复运行,停不下来。只有job2和job3停下来了,被真正cancel掉。

对kotlin协程的cancel,并不一定能真正让已经启动的协程任务停止,这很像过去标准的Java线程Runnable体内的run(),run方法一旦跑起来,在外部通过Thread的stop那些方法,是无法保证停止run()里面的执行的。

在协程中,在协程外面通过调用cancel()方法取消协程任务,在协程内部的运行体内,类似过去java线程的run()体内,只要有delay函数,或者ensureActive()就可以取消内部执行流程。也可以像过去Java的线程终止方式那样,通过协程的isActive方法,作为条件判断,感知协程外部是否调用了cancel方法取消了协程,像job4那样。

相关:

https://blog.csdn.net/zhangphil/article/details/142328963

https://blog.csdn.net/zhangphil/article/details/132621143

相关推荐
Haha_bj1 天前
七、Kotlin——扩展(Extensions)
android·kotlin
urkay-1 天前
Android getDrawingCache 过时废弃
android·java·开发语言·kotlin·iphone·androidx
用户69371750013841 天前
24.Kotlin 继承:调用超类实现 (super)
android·后端·kotlin
alexhilton1 天前
借助RemoteCompose开发动态化页面
android·kotlin·android jetpack
QING6182 天前
Jetpack Compose Brush API 简单使用实战 —— 新手指南
android·kotlin·android jetpack
QING6182 天前
Jetpack Compose Brush API 详解 —— 新手指南
android·kotlin·android jetpack
鹿里噜哩2 天前
Spring Authorization Server 打造认证中心(二)自定义数据库表
spring boot·后端·kotlin
用户69371750013842 天前
23.Kotlin 继承:继承的细节:覆盖方法与属性
android·后端·kotlin