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没有被执行的机会

运行结果:

image

二,改进: 例子二

代码:

       //处理按钮点击事件
        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")
            }
        }

运行结果:

image

修改中launch使用了参数Dispatchers.Default,
执行canel()的协程1和死循环的协程2在不在同一个线程内,
所以能顺利执行,取消协程2的死循环

 

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