kotlin: Job() 工厂方法作为父协程

一,Job()作为父协程时,子协程的状态不会影响它的状态

代码:

        //处理按钮点击事件
        binding.button1.setOnClickListener {
            runBlocking {
                val parentJob = Job()
                launch(parentJob) { // 使用新的 job 替换原有的父 job
                    delay(1000)
                    println("Text 1")
                }
                launch(parentJob) { // 使用新的 job 替换原有的父 job
                    delay(2000)
                    println("Text 2")
                }
                println("isActive:"+parentJob.isActive)
                println("isCompleted:"+parentJob.isCompleted)
                parentJob.complete()
                println("isActive:"+parentJob.isActive)
                println("isCompleted:"+parentJob.isCompleted)
                parentJob.join()
                println("isActive:"+parentJob.isActive)
                println("isCompleted:"+parentJob.isCompleted)
                println("执行结束")
            }
        }

运行结果:

image

如果不加complete(),父协程的状态不会改变,会停留在join()方法执行不下去

二,正常情况下的父子协程

代码:

        //处理按钮点击事件
        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结束")
                    }
                }
                println("isActive:"+parentJob.isActive)
                println("isCompleted:"+parentJob.isCompleted)
                parentJob.join() // 这里会挂起大约3秒钟
                println("isActive:"+parentJob.isActive)
                println("isCompleted:"+parentJob.isCompleted)
                println("执行结束")
            }

运行结果:

image

三,另一个方法:遍历join()子协程

代码:

        //处理按钮点击事件
        binding.button3.setOnClickListener {
            runBlocking {
                val parentJob = Job()
                launch(parentJob) { // 使用新的 job 替换原有的父 job
                    delay(1000)
                    println("Text 1")
                }
                launch(parentJob) { // 使用新的 job 替换原有的父 job
                    delay(2000)
                    println("Text 2")
                }
                println("isActive:"+parentJob.isActive)
                println("isCompleted:"+parentJob.isCompleted)
                parentJob.children.forEach { it.join() }
                println("isActive:"+parentJob.isActive)
                println("isCompleted:"+parentJob.isCompleted)
                println("执行结束")
            }
        }

运行结果:

image

可以看到子协程结束后,父协程的状态并没有变化,所以直接对Job()产生的父协程做join()无效

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