kotlin: 协程的父子关系

一,代码:

        //处理按钮点击事件
        binding.button1.setOnClickListener {
            runBlocking {
                val parentJob: Job
                var job1: Job? = null
                var job2: Job? = null
                var job3: Job? = null

                parentJob = launch {
                    job1 = launch {
                        println("job1开始")
                        delay(1000L)
                        println("job1结束")
                    }

                    job2 = launch {
                        println("job2开始")
                        delay(3000L)
                        println("job2结束")
                    }

                    job3 = launch {
                        println("job3开始")
                        delay(5000L)
                        println("job3结束")
                    }
                }

                delay(500L)

                parentJob.children.forEachIndexed { index, job ->
                    when (index) {
                        0 -> println("job1 === 第0个job is ${job1 === job}")
                        1 -> println("job2 === 第1个job is ${job2 === job}")
                        2 -> println("job3 === 第2个job is ${job3 === job}")
                    }
                }

                parentJob.join() // 这里会挂起大约5秒钟
                logX("处理结束!")
            }
        }


        //处理按钮点击事件
        binding.button2.setOnClickListener {
            runBlocking {
                val parentJob: Job
                var job1: Job? = null
                var job2: Job? = null
                var job3: Job? = null

                parentJob = launch {
                    job1 = launch {
                        println("job1开始")
                        delay(1000L)
                        println("job1结束") // ①,不会执行
                    }

                    job2 = launch {
                        println("job2开始")
                        delay(3000L)
                        println("job2结束") // ②,不会执行
                    }

                    job3 = launch {
                        println("job3开始")
                        delay(5000L)
                        println("job3结束") // ③,不会执行
                    }
                }

                delay(500L)

                parentJob.children.forEachIndexed { index, job ->
                    when (index) {
                        0 -> println("job1 === 第0个job is ${job1 === job}")
                        1 -> println("job2 === 第1个job is ${job2 === job}")
                        2 -> println("job3 === 第2个job is ${job3 === job}")
                    }
                }

                parentJob.cancel() // 变化在这里
                logX("处理结束!")
            }
        }

说明: 父协程的join()和cancel()会对子协程生效

二,运行结果:

第1个按钮点击:

第2个按钮点击:

posted @ 2025-07-26 11:38  刘宏缔的架构森林  阅读(6)  评论(0)    收藏  举报