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那样。
相关: