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

相关推荐
墨天梦20 小时前
B17_LifecycleLiveData与Flow
android·kotlin
熊猫钓鱼>_>1 天前
Kotlin Multiplatform for OpenHarmony 实战:为 Landscapist 实现图片加载适配
开发语言·kotlin·华为云·ai编程·harmonyos·鸿蒙·openharmony
ZealSinger1 天前
Kotlin2.4迁移context parameters
kotlin·协程·迁移·kotlin2.4
墨天梦1 天前
B16_Material主题与可访问交互
android·kotlin·交互
alexhilton2 天前
模块化Jetpack Compose架构
android·kotlin·android jetpack
mmsx2 天前
Android 测绘计算工程化:七四参数、高程拟合与单位系统
android·kotlin
事圆则缓2 天前
Kotlin Flow、StateFlow、SharedFlow 全解析:冷流、热流与 Android 状态管理
android·kotlin·php
应用市场2 天前
把旧 Pixel 变成相册备份中转站(上):Mac 到安卓的照片传输工具设计——流式上传、sha256 校验、adb forward 与 Bonjour
android·macos·adb·kotlin·swift
Kapaseker2 天前
Android 以后可能不会再有横竖屏适配了
android·kotlin
墨天梦2 天前
B13_通知图片相机与影音
android·数码相机·kotlin