kotlin: delay和Thread.sleep的区别:是否检测当前协程被取消

一,代码:

        //处理按钮点击事件
        binding.button1.setOnClickListener {
            runBlocking {
                val job = launch {
                    var i = 0
                    while (true) {
                        Thread.sleep(500L)
                        //delay(500L)
                        i ++
                        println("i = $i")
                    }
                }
                delay(2000L)
                job.cancel()
                job.join()

                println("End")
            }
        }


        //处理按钮点击事件
        binding.button2.setOnClickListener {
            runBlocking {
                val job = launch {
                    var i = 0
                    while (true) {
                        delay(500L)
                        i ++
                        println("i = $i")
                    }
                }
                delay(2000L)
                job.cancel()
                job.join()

                println("End")
            }
        }

 delay() 函数可以自动检测当前的协程是否已经被取消,
如果已经被取消的话,它会抛出一个 CancellationException,从而终止当前的协程。
而Thread.sleep不会检测协程是否被取消,
所以开发中在协程中不建议使用Thread.sleep

二,运行结果:

点击按钮1后:

image
点击按钮2后:

image

 

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