Kotlin cancel CoroutineScope.launch的任务后仍运行
import kotlinx.coroutines.*fun main() {runBlocking {val coroutineScope = CoroutineScope(Dispatchers.IO)val job = coroutineScope.launch {var i = 0while (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 = 0while (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 = 0while (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