Kotlin Coroutine执行顺序相同线程



我遇到一些代码,它创建了一个带有单线程上下文的CoroutineScope

val serialThreadContext = newSingleThreadContext("mysinglethreadcontext")
fun myScope(): CoroutineScope = CoroutineScope(serialThreadContext)

然后在代码库的其他地方,协同程序在这个范围内启动。。。

myScope().launch {
someOtherMethod()
...
}

据我所知,所有这些创建的协同程序都将被调度在同一个线程上,但我找不到任何关于执行或暂停顺序的特定文档。

这在我脑海中提出了以下问题:

  1. 如果someOtherMethod不包含任何suspend函数,这个协程仍然可以被线程挂起吗?

  2. 当线程从调度程序中提取协同程序时,是否有任何保证的执行顺序?

  1. 子程序只能在挂起函数时挂起。一旦调用了someOtherMethod,如果它不是一个挂起函数,那么就无法避免在挂起线程之前等待该函数返回。请注意,标记为suspend的函数仍然不意味着它一定会挂起调用它的协程。如果它不在内部挂起其他调度器上的工作,它仍然会占用您的调用线程。

  2. 无法保证执行顺序。您不应该依赖于单线程调度程序来尝试按顺序对工作进行排队。关于如何使用Channel创建工作队列的示例,请参阅我的答案。

最新更新