Kotlin 科特林协同程序执行令?
有人能告诉我这个代码示例中发生了什么吗:Kotlin 科特林协同程序执行令?,kotlin,kotlin-coroutines,Kotlin,Kotlin Coroutines,有人能告诉我这个代码示例中发生了什么吗: import kotlinx.coroutines.* import kotlin.time.* fun subTask(scope: CoroutineScope): Job { val job = scope.launch(Dispatchers.IO){ println("SubTask started.") delay(500L) println("SubT
import kotlinx.coroutines.*
import kotlin.time.*
fun subTask(scope: CoroutineScope): Job {
val job = scope.launch(Dispatchers.IO){
println("SubTask started.")
delay(500L)
println("SubTask ending.")
}
job.invokeOnCompletion(object: CompletionHandler{
override fun invoke(cause: Throwable?) {
println("SubTask completed.")
}
})
return job
}
fun main() {
val duration = measureTime {
runBlocking {
val job = withContext(Dispatchers.IO) {
subTask(this)
}
println("Waiting for SubTask")
job.join()
}
}
println("Duration: $duration")
}
我正期待着见到你
SubTask started.
Waiting for SubTask
SubTask ending.
SubTask completed.
Duration: 600ms
但是我越来越
SubTask started.
SubTask ending.
SubTask completed.
Waiting for SubTask
Duration: 600ms
为什么子任务不能与main()并行运行?
withContext
将挂起,直到完成为止。由于您正在将withContext
的作用域传递给子任务()
,并且子任务()
使用它来启动其作业,withContext
将挂起,直到另一个启动的作业完成。如果subTask()
使用了不同的CoroutineScope
,或者如果您没有将subTask()
调用包装到withContext
,那么您就有了预期的行为。withContext
将暂停,直到完成为止。由于您正在将withContext
的作用域传递给子任务()
,并且子任务()
使用它来启动其作业,withContext
将挂起,直到另一个启动的作业完成。如果subTask()
使用了不同的CoroutineScope
,或者如果您没有将subTask()
调用包装到上下文中
,那么您就有了预期的行为。join()
首先是invokeonpomletion()
invokeonpomletion不是问题。当作业完成时,按预期调用它。问题是作业在调用join()之前完成其delay()调用。join()
首先,然后是invokeonpomletion()
invokeonpomletion不是问题所在。当作业完成时,按预期调用它。问题是作业在调用join()之前完成了其delay()调用。