为什么以及何时使用Kotlin在Android中使用协同例程代替线程,因为没有并行性?

时间:2018-04-02 06:39:04

标签: android kotlin coroutine kotlin-coroutines

我正在经历共同惯例的概念及其在 kotlin 中的使用和实施。

我用谷歌搜索并阅读了几个答案,就像它在架构和性能方面与线程的不同而言。

这里解释得非常好,

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

足够公平,合作例程很棒,没有内存开销,性能卓越,没有死锁,竞争条件等等,并且易于使用。

现在,这里有一些事情,我很困惑,并希望更清晰 -

  1. 我应该何时在Android中使用协同例程和线程?或者我应该坚持只是合作惯例?
  2. 如果,我只是坚持使用协同例程,那么它将如何利用CPU核心,因为它在单个线程上运行。
  3. 协同例程很好用,但它如何利用多个内核来提高性能。

1 个答案:

答案 0 :(得分:7)

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

协同程序是关于编程模型的,而线程是关于执行模型的

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

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

一个很好的比喻是,线程是协调CPU内核到线程的协同程序:

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

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