• 神秘嘉Bin
    2022-03-02
    suspend方法需要在协程中执行,协程又一定有上下文,所以可以访问的到哈~ 也就是在suspend方法中可以访问当前协程上下文,并且拿到一些有用的信息

    作者回复: 很到位~

    
    9
  • 夜班同志
    2022-02-22
    挂起函数的Continuation就有CoroutineContext

    作者回复: 没错~

    
    7
  • 白泽丶
    2022-03-12
    如果为协程作用域创建时传入多个CoroutineContext,比如 Job() + Dispatcher.IO + Dispatcher.Main ,那么携程最终会在哪个线程池中执行呢

    作者回复: Dispatcher之间的组合其实并没有意义,你可以将其理解为后者替换前者。不过,在大部分情况下,IDE都会直接报错并告诉你:“Dispatcher之间的组合没有意义”。 ``` fun main() { // 报错 val scope = CoroutineScope(Dispatchers.IO + Dispatchers.Main) } ```

    共 2 条评论
    5
  • 白乾涛
    2022-02-26
    1、思考题中的方法为什么要加 suspend,加不加有什么区别吗? 2、为什么代码打印的都是 EmptyCoroutineContext,且没有 name? import kotlinx.coroutines.* import kotlinx.coroutines.GlobalScope.coroutineContext fun main() = runBlocking { printInfo(1) // 1 - EmptyCoroutineContext - null CoroutineScope(Dispatchers.IO + Job() + CoroutineName("bqt")).launch { printInfo(2) // 2 - EmptyCoroutineContext - null } delay(100L) } suspend fun printInfo(text: Any) = println("$text - $coroutineContext - ${coroutineContext[CoroutineName]?.name}")

    作者回复: import kotlin.coroutines.coroutineContext 导包的时候,不要弄错了。

    共 3 条评论
    5
  • 神秘嘉Bin
    2022-03-02
    如果你理解了第 14 讲的内容,那你一定能分析出它们的运行顺序应该是:1、4、2、3。 也有可能是1、2、4、3吧? 这个得看CPU的调度了,也有可能子协程的2线运行吧?

    作者回复: ``` 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,则可能出现其他的代码运行顺序。

    共 2 条评论
    4
  • 面无表情的生鱼片
    2022-02-21
    请教老师,经常看到 Job() + Dispatcher ,这么做是什么原因呢

    作者回复: 操作符重载你肯定能理解了对吧?至于Job() + Dispatcher的含义,其实就是同时指定:parentJob,还有线程池。

    共 2 条评论
    3
  • WWWarmFly
    2022-03-20
    请教老师, Dispatcher 内部成员的类型是CoroutineContext,这里怎么推出 Dispatcher 确实就是 CoroutineContext

    作者回复: 这样的关系:Dispatcher - CoroutineContext.Element - CoroutineContext

    
    2
  • 7Promise
    2022-02-21
    思考题代码可以运行。coroutineContext方法是返回当前的CoroutineContext,因为runBlocking是CorouScope,CorouScope具有成员CoroutineContext,所以coroutineContext方法可以返回runBlocking的CoroutineContext。

    作者回复: 嗯,没错。

    
    2
  • Shanks-王冲
    2022-03-17
    Kotlin1.6源码package kotlin.coroutines中找到了这个,public suspend inline val coroutineContext: CoroutineContext,成员定义成suspend了,我不知道该怎么解释,贴出试试

    作者回复: 没错,方向是对的,这就是我希望你们去看的coroutineContext变量,你可以再想想它的作用吗? PS:具体答案我会在第27讲里给出的。

    
    1
  • Renext
    2022-03-08
    代码段6报错: Cannot access 'ExecutorCoroutineDispatcherImpl': it is private in file

    作者回复: ExecutorService.asCoroutineDispatcher()是Kotlin的源码哈,不需要你写进工程里的。

    
    