#牛客在线求职答疑中心# runBlocking {
var job = Job()
launch(job) {
println("1")
delay(1000)
println("2")
}
launch(job) {
println("3")
delay(2000)
println("4")
}
job.join()
println("end")
}
这个不会走路最后的end打印,具体原因是什么啊
var job = Job()
launch(job) {
println("1")
delay(1000)
println("2")
}
launch(job) {
println("3")
delay(2000)
println("4")
}
job.join()
println("end")
}
这个不会走路最后的end打印,具体原因是什么啊
全部评论
这段代码是一个Kotlin协程的例子,其中`runBlocking`是一个挂起函数,用于启动一个新的协程并阻塞当前线程,直到协程执行完毕。在这个例子中,`runBlocking`创建了一个新的协程`job`,并在该协程中启动了两个子协程。
第一个子协程在`launch`函数中执行,该函数用于启动一个新的协程并立即返回,而不会阻塞当前线程。在这个子协程中,首先打印"1",然后延迟1000毫秒,最后打印"2"。
第二个子协程也在`launch`函数中执行,同样首先打印"3",然后延迟2000毫秒,最后打印"4"。
`job.join()`是一个挂起函数,用于等待协程`job`执行完毕。在这个例子中,`job`是`runBlocking`创建的协程,所以`job.join()`实际上是在等待`runBlocking`创建的协程执行完毕。
然而,由于`runBlocking`创建的协程中启动了两个子协程,这两个子协程的执行顺序是不确定的。如果第一个子协程先执行,那么它将打印"1",然后延迟1000毫秒,然后打印"2"。如果第二个子协程先执行,那么它将打印"3",然后延迟2000毫秒,然后打印"4"。
由于`runBlocking`创建的协程需要等待其所有子协程执行完毕才能结束,所以如果第一个子协程先执行,那么`runBlocking`创建的协程将等待1000毫秒,然后打印"2",最后打印"end"。如果第二个子协程先执行,那么`runBlocking`创建的协程将等待2000毫秒,然后打印"4",最后打印"end"。
因此,`end`的打印时间取决于哪个子协程先执行。如果第一个子协程先执行,那么`end`将在1000毫秒后打印。如果第二个子协程先执行,那么`end`将在2000毫秒后打印。
分享
你的父job一直处于 协程的Active状态,没有转化到Completing状态。 所以join会一直卡住。 在job.join之前,加上 job.complete() ,会让job进入Completing状态,然后Child Job完成,父Job会进入到Completed状态。就返回了~
分享
联易融
官网直投
相关推荐
点赞 评论 收藏
转发
03-04 10:49
重庆工业职业技术学院 计算机类 点赞 评论 收藏
转发
点赞 评论 收藏
转发
点赞 评论 收藏
转发