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
Don';t在多个协同程序运行时退出Kotlin程序_Kotlin_Coroutine_Kotlinx.coroutines - Fatal编程技术网

Don';t在多个协同程序运行时退出Kotlin程序

Don';t在多个协同程序运行时退出Kotlin程序,kotlin,coroutine,kotlinx.coroutines,Kotlin,Coroutine,Kotlinx.coroutines,在我的程序的几个点上,我使用launch启动一个协同程序,执行一些后台任务。然后,在某个时刻,我从main函数返回。我的程序的简化版本可能如下所示: fun main(args : Array<String>) { launch { delay(10000) // some long running operation println("finished") } } fun main(args:Array) { 发射{ 延迟(1000

在我的程序的几个点上,我使用
launch
启动一个协同程序,执行一些后台任务。然后,在某个时刻,我从
main
函数返回。我的程序的简化版本可能如下所示:

fun main(args : Array<String>)
{
    launch {
        delay(10000) // some long running operation
        println("finished")
    }
}
fun main(args:Array)
{
发射{
延迟(10000)//一些长时间运行的操作
println(“完成”)
}
}
现在,协同程序按预期启动并开始运行操作,然后程序退出。如果我没有从
main
返回,或者用
thread
替换
launch
,一切都会正常工作既然我没有跟踪程序中启动的所有协同程序(因此我不能使用
.join()
.await()
),我如何才能确保所有协同程序在程序退出之前完成?

那么,如果我没有跟踪程序中启动的所有协同程序(因此我不能使用.join()或.await()),我如何确保所有协同程序在程序退出之前完成呢

您需要保持跟踪,并在某个时刻等待结果,以便确保这些协同工作已经完成。这是因为“协同程序就像守护进程线程”:


这不是常规Java
线程的情况,默认情况下是这样的。

不,当我退出Java线程在后台运行的主要方法时,对不起,我走错了路,你是对的,这些线程基本上是非守护进程的,如果我能告诉协程在这样的线程上运行,它们就不应该被终止——但我的理解是,
launch
,除非另有规定,否则在幕后使用
ForkJoinThreadPool
?这是一种间接连接,通过协程上下文的可选功能。但是,如果启动显式执行器服务并将其用作协同路由的上下文,则应用程序将继续运行,直到显式关闭该执行器,或者直到执行器本身决定停止线程为止。
cachedThreadPool
将在空闲60秒后自动停止线程。因此,即使您这样设置,应用程序也不会等待协同路由,而是等待executor服务的线程完成。根据具体情况,它们可能永远不会完成,甚至可能在您的协同程序之前完成(例如,如果一个协同程序在没有计划恢复的情况下被暂停)。