作者回复: 很到位~
作者回复: 没错~
作者回复: Dispatcher之间的组合其实并没有意义,你可以将其理解为后者替换前者。不过,在大部分情况下,IDE都会直接报错并告诉你:“Dispatcher之间的组合没有意义”。 ``` fun main() { // 报错 val scope = CoroutineScope(Dispatchers.IO + Dispatchers.Main) } ```
作者回复: import kotlin.coroutines.coroutineContext 导包的时候,不要弄错了。
作者回复: ``` fun main() = runBlocking { logX("Before launch.") // 1 launch { logX("In launch.") // 2 delay(1000L) logX("End launch.") // 3 } logX("After launch") // 4 } ``` 如果只针对这个案例,由于这里不涉及到多线程,所有协程都会运行在main之上,所以,我们基本上可以认为代码的执行顺序是这样的:1、4、2、3。 但如果涉及到多线程,则可能由于主线程繁忙,coroutine2在子线程先运行,而输出:1、2、4、3。 另外,如果我们配置其他的启动模式,或者其他的Context,则可能出现其他的代码运行顺序。
作者回复: 操作符重载你肯定能理解了对吧?至于Job() + Dispatcher的含义,其实就是同时指定:parentJob,还有线程池。
作者回复: 这样的关系:Dispatcher - CoroutineContext.Element - CoroutineContext
作者回复: 嗯,没错。
作者回复: 没错,方向是对的,这就是我希望你们去看的coroutineContext变量,你可以再想想它的作用吗? PS:具体答案我会在第27讲里给出的。
作者回复: ExecutorService.asCoroutineDispatcher()是Kotlin的源码哈,不需要你写进工程里的。