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个按钮点击: