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,考虑这段代码: val coroutineDispatcher = Executors.newFixedThreadPool(8).asCoroutineDispatcher() fun main() = runBlocking { launch(coroutineDispatcher) { println("'launch' finished execution") } println("This will be printed, but 'ru

考虑这段代码:

val coroutineDispatcher = Executors.newFixedThreadPool(8).asCoroutineDispatcher()

fun main() = runBlocking {
    launch(coroutineDispatcher) { println("'launch' finished execution") }
    println("This will be printed, but 'runBlocking' will never exit")
}
main()
函数将永远不会退出,程序将永远挂起。但是,如果我使用任何标准调度程序,例如
Default
IO
等,程序将在
runBlocking
launch
返回后结束。如果调用
coroutineDispatcher.close()
,程序也将按预期退出

我的问题是:

如果客户端代码无权访问该调度器,那么关闭该调度器的正确方法是什么?假设我在客户端代码中公开了以下函数:

private val coroutineDispatcher = Executors.newFixedThreadPool(8).asCoroutineDispatcher()

suspend fun doStuff(block: () -> Unit) {
    withContext(coroutineDispatcher) {
        block()
    }
}

如何确保客户端代码完成后程序成功退出?特别是当
doStuff()
应该被多次调用时。

您可以向客户端公开
dispose/clear
函数,这只需取消/关闭您的协同路由范围

您可以向客户端公开
dispose/clear
函数,这只会取消/关闭您的协同程序范围

,但会将管理资源的负担放到客户机上,这是我想要避免的。另外,没有一个默认的分派器必须关闭,所以我想有一个不同的wayWell,然后你可以依赖一个抽象。但我认为,你必须以某种方式向回购发出信号,表明你的消费者不再是有效的,但这会把管理资源的负担推到客户身上,这是我希望避免的。另外,没有一个默认的分派器必须关闭,所以我想有一个不同的wayWell,然后你可以依赖一个抽象。但我认为,你必须以某种方式向回购发出信号,表明你的消费者已不复存在