如何强制2个协程使用同一个线程

问题描述 投票:0回答:1

在此代码中:

private suspend fun doSthSingleThreaded(){
    coroutineScope {
        //Coroutine 1
        launch {
            //do sth that will suspend
        }
        //Coroutine 2
        launch {
            //Do sth else that will suspend too
        }
    }
}

有没有办法让这两个协程始终共享底层线程?这就是我希望它工作的方式(我想以它们都使用 threadA 的方式调整代码):

  • 协程 1 在线程 A 上运行(协程 2 被挂起)
  • 协程 1 暂停,协程 2 在线程 A 上运行
  • 协程 2 完成了它的工作,协程 1 继续在 threadA 上工作,直到完成,然后函数返回。
kotlin concurrency coroutine
1个回答
0
投票

您可以使用 newSingleThreadContext 获得单线程绑定的协程调度程序。但请注意:

专用线程是非常昂贵的资源。在真实的应用程序中,当不再需要时,必须使用 close 函数释放它,或者将其存储在顶级变量中并在整个应用程序中重用。

如果您只需要限制并行度,您可以使用 limitedParallelism 代替:

Dispatchers.Default.limitedParallelism(1)

private suspend fun doSthSingleThreaded() {
    val confined = newSingleThreadContext("My Thread")
//    or
//    val confined = Dispatchers.Default.limitedParallelism(1)
    coroutineScope {
        //Coroutine 1
        launch(confined) {
            //do sth that will suspend
        }
        //Coroutine 2
        launch(confined) {
            //Do sth else that will suspend too
        }        
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.