【问题标题】:Why and when to use co-routines instead of threads in Android using Kotlin as there is no parallelism?为什么以及何时在使用 Kotlin 的 Android 中使用协程而不是线程,因为没有并行性?
【发布时间】:2018-09-11 09:16:50
【问题描述】:

我正在研究协同例程的概念以及它在 kotlin 中的用法和实现。

我在谷歌上搜索并阅读了一些答案,因为它在架构和性能方面与线程有何不同。

这里解释得很好,

Difference between a "coroutine" and a "thread"?

公平地说,协同程序很棒,没有内存开销,性能很好,没有死锁,竞争条件等,并且易于使用。

现在,这里有几件事情,我很困惑,并希望在同一方面更清楚 -

  1. 什么时候应该在 Android 中使用协程和线程?还是应该只使用协同程序?
  2. 如果,我只是坚持使用协程,那么它将如何利用 CPU 内核,因为它在单线程上运行。

协同例程非常好用,但它如何利用多核来提高性能。

【问题讨论】:

    标签: android kotlin coroutine kotlin-coroutines


    【解决方案1】:

    线程和协程几乎是正交的特征。

    协程是关于你的编程模型,线程是关于你的执行模型。

    如果您想在 Android 中获取 URL 或执行重量级计算,则必须使用异步编程。你可以选择用老式的方式来做,用回调,或者用协程,这会让那些拐杖消失。您只需调用一个可挂起的函数并将结果作为其返回值。

    请注意,对于重量级计算,您将使用带或不带协程的额外线程。对于网络操作,您不需要额外的线程,无论有没有协程。

    一个很好的类比是线程之于协程就像 CPU 内核之于线程:

    操作系统将线程分配给 CPU 内核,直到线程挂起。稍后,同一线程可以在另一个内核上恢复。

    协程调度器将协程分配给线程,直到协程挂起。稍后,同一个协程可以在另一个线程上恢复。

    【讨论】:

    • Kotlin 协程是否会在必要时(当需要多个内核时)自动生成线程?还是只是协程上下文会产生线程?
    • 协程本身与线程无关。挂起的协程只不过是一个带有resume() 方法的普通Java 对象。所有线程操作都在协程调度程序中(它是上下文的一部分)。 UI 调度程序从不产生线程,它只是将协程提交给 UI 线程。 Unconfined 只是在调用线程上恢复协程。甚至 CommonPool 也不会自己产生线程,而只是将协程提交给全局 ExecutorService,然后它会执行它配置的任何操作。
    猜你喜欢
    • 2018-04-29
    • 1970-01-01
    • 2021-12-22
    • 2013-10-31
    • 2015-04-29
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多