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() 执行完成")
            }
        }

运行效果:

image

三,例子: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() 执行完成")
            }
        }

运行效果:

image

posted @ 2025-08-02 15:06  刘宏缔的架构森林  阅读(21)  评论(0)    收藏  举报