kotlin:一个协程死循环时不能被同一个线程中的另一个协程取消
一,例子一:
代码:
//处理按钮点击事件
binding.button3.setOnClickListener {
runBlocking {
//(Dispatchers.Default)
println("协程:${Thread.currentThread().name}")
val job = launch {
println("协程launch开始:${Thread.currentThread().name}")
var i = 0
// 变化在这里
while (isActive) {
Thread.sleep(500L)
i ++
println("i = $i")
}
}
println("开始delay:${Thread.currentThread().name}")
delay(2000L)
println("开始cancel:${Thread.currentThread().name}")
job.cancel()
job.join()
println("End")
}
}
cancel()并未得到执行,因为它所在的协程1和死循环的协程2在同一个线程中,
协程2死循环后,协程1没有被执行的机会
运行结果:
二,改进: 例子二
代码:
//处理按钮点击事件
binding.button4.setOnClickListener {
runBlocking {
println("协程:${Thread.currentThread().name}")
val job = launch(Dispatchers.Default) {
println("协程launch开始:${Thread.currentThread().name}")
var i = 0
// 变化在这里
while (isActive) {
Thread.sleep(500L)
i ++
println("i = $i")
}
}
println("开始delay:${Thread.currentThread().name}")
delay(2000L)
println("开始cancel:${Thread.currentThread().name}")
job.cancel()
job.join()
println("End")
}
}
运行结果:
修改中launch使用了参数Dispatchers.Default,
执行canel()的协程1和死循环的协程2在不在同一个线程内,
所以能顺利执行,取消协程2的死循环