Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 科特林协同程序执行令?_Kotlin_Kotlin Coroutines - Fatal编程技术网

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()调用。