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("执行结束")
}
}
运行结果:
如果不加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("执行结束")
}
运行结果:
三,另一个方法:遍历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("执行结束")
}
}
运行结果:
可以看到子协程结束后,父协程的状态并没有变化,所以直接对Job()产生的父协程做join()无效