Kotlin cancel CoroutineScope.launch的任务后仍运行
Kotlin cancel CoroutineScope.launch的任务后仍运行
import kotlinx.coroutines.*
fun main() {
runBlocking {
val coroutineScope = CoroutineScope(Dispatchers.IO)
val job = coroutineScope.launch {
var i = 0
while (i < Int.MAX_VALUE) {
i++
println(i)
}
}
// 2ms 取消协程
delay(2)
println("cancel...")
job.cancel()
coroutineScope.cancel()
println("cancel!")
}
}
...
997
998
999
cancel!
1000
1001
1002
...
加上 coroutineScope.isActive,控制while循环。
import kotlinx.coroutines.*
fun main() {
runBlocking {
val coroutineScope = CoroutineScope(Dispatchers.IO)
val job = coroutineScope.launch {
var i = 0
while (i < Int.MAX_VALUE && coroutineScope.isActive) {
i++
println(i)
}
}
// 2ms 取消协程
delay(2)
println("cancel...")
job.cancel()
coroutineScope.cancel()
println("cancel!")
}
}
...
598
599
600
cancel!Process finished with exit code 0
也可以加上:
yield()
控制:
import kotlinx.coroutines.*
fun main() {
runBlocking {
val coroutineScope = CoroutineScope(Dispatchers.IO)
val job = coroutineScope.launch {
var i = 0
while (i < Int.MAX_VALUE) {
yield()
i++
println(i)
}
}
// 2ms 取消协程
delay(2)
println("cancel...")
job.cancel()
coroutineScope.cancel()
println("cancel!")
}
}
...
108
109
110
cancel!
kotlin协程Job、CoroutineScope作用域,Android_kotlinx.coroutines.job-CSDN博客文章浏览阅读555次。一般编程的技法,比如,在Android中,假设在主线程中实现了一个函数,但该函数是耗时操作,毫无疑问,需要将这个函数的实现切入非主线程中操作,那么可以设计一种托管的函数,在托管的函数里面干脏活,处理完成后,把结果抛到主线程。结果1-a: 5 - tid:22。一般编程的技法,比如,在Android中,假设在主线程中实现了一个函数,但该函数是耗时操作,毫无疑问,需要将这个函数的实现切入非主线程中操作,那么可以设计一种托管的函数,在托管的函数里面干脏活,处理完成后,把结果抛到主线程。_kotlinx.coroutines.jobhttps://zhangphil.blog.csdn.net/article/details/131096325