kotlin: cancel()和cancelAndJoin()
一,cancel()和cancelAndJoin()两者的区别:
cancel() 方法用于取消协程,但是它不会等待协程的结束,
调用此方法后,协程可能会被中断,但并不保证它会立刻停止,尤其是在协程处于挂起状态时
cancelAndJoin() 方法不仅会取消协程,还会等待该协程完全终止。
这意味着,调用 cancelAndJoin() 后,当前线程会阻塞,直到协程取消并完成
cancel():取消协程,不等待协程执行完成。调用后,协程会被标记为取消,
挂起点处会抛出 CancellationException,但调用线程不会等待协程的结束。
cancelAndJoin():取消协程,并且等待协程完全终止。调用此方法后,当前线程会阻塞,直到协程完成。
通常,当你需要在取消协程之后确保它完全结束后再执行后续操作时,应该使用 cancelAndJoin()。
如果你只需要取消协程,不需要关心它是否完全结束,可以使用 cancel()
二,例子:cancel()
代码:
//处理按钮点击事件
binding.button1.setOnClickListener {
runBlocking {
val job = launch(Dispatchers.Default) {
var i = 0
while (isActive) {
//delay(300)
Thread.sleep(300) // 我们模拟一些耗时操作
i ++
println("当前数字: $i")
}
}
delay(500)
println("cancel() 执行开始")
job.cancel()
println("cancel() 执行完成")
}
}
运行效果:
三,例子:cancelAndJoin()
代码:
//处理按钮点击事件
binding.button2.setOnClickListener {
runBlocking {
val job = launch(Dispatchers.Default) {
var i = 0
while (isActive) {
//delay(300)
Thread.sleep(300) // 我们模拟一些耗时操作
i ++
println("当前数字: $i")
}
}
delay(500)
println("cancelAndJoin() 执行开始")
job.cancelAndJoin()
println("cancelAndJoin() 执行完成")
}
}
运行效果: