我遇到一些代码,它创建了一个带有单线程上下文的CoroutineScope
val serialThreadContext = newSingleThreadContext("mysinglethreadcontext")
fun myScope(): CoroutineScope = CoroutineScope(serialThreadContext)
然后在代码库的其他地方,协同程序在这个范围内启动。。。
myScope().launch {
someOtherMethod()
...
}
据我所知,所有这些创建的协同程序都将被调度在同一个线程上,但我找不到任何关于执行或暂停顺序的特定文档。
这在我脑海中提出了以下问题:
如果
someOtherMethod
不包含任何suspend
函数,这个协程仍然可以被线程挂起吗?当线程从调度程序中提取协同程序时,是否有任何保证的执行顺序?
-
子程序只能在挂起函数时挂起。一旦调用了
someOtherMethod
,如果它不是一个挂起函数,那么就无法避免在挂起线程之前等待该函数返回。请注意,标记为suspend
的函数仍然不意味着它一定会挂起调用它的协程。如果它不在内部挂起其他调度器上的工作,它仍然会占用您的调用线程。 -
无法保证执行顺序。您不应该依赖于单线程调度程序来尝试按顺序对工作进行排队。关于如何使用Channel创建工作队列的示例,请参阅我的答案。