Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
由于没有并行性,为什么以及何时在Android中使用协同例程而不是线程?_Android_Kotlin_Coroutine_Kotlin Coroutines - Fatal编程技术网

由于没有并行性,为什么以及何时在Android中使用协同例程而不是线程?

由于没有并行性,为什么以及何时在Android中使用协同例程而不是线程?,android,kotlin,coroutine,kotlin-coroutines,Android,Kotlin,Coroutine,Kotlin Coroutines,我在kotlin中介绍了co例程的概念及其使用和实现 我在谷歌上搜索并阅读了一些关于它在架构和性能方面与线程有什么不同的答案 这里解释得很好, 公平地说,co例程非常好,没有内存开销,性能非常好,没有死锁,竞争条件等等,并且易于使用 现在,这里有几件事让我感到困惑,我想更清楚地说明一下- 我什么时候应该在Android中使用联合例程和线程?还是我应该坚持共同的惯例 如果我坚持使用co例程,那么它将如何利用CPU内核,因为它运行在单个线程上 Co例程非常好用,但它如何利用多核来提高性能 线程和协

我在kotlin中介绍了co例程的概念及其使用和实现

我在谷歌上搜索并阅读了一些关于它在架构和性能方面与线程有什么不同的答案

这里解释得很好,

公平地说,co例程非常好,没有内存开销,性能非常好,没有死锁,竞争条件等等,并且易于使用

现在,这里有几件事让我感到困惑,我想更清楚地说明一下-

  • 我什么时候应该在Android中使用联合例程和线程?还是我应该坚持共同的惯例
  • 如果我坚持使用co例程,那么它将如何利用CPU内核,因为它运行在单个线程上

  • Co例程非常好用,但它如何利用多核来提高性能

    线程和协程几乎是正交的特性

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

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

    请注意,对于重量级计算,您将使用额外的线程,包括或不包括协同路由。对于网络操作,您不需要额外的线程,无论是否使用协同路由

    一个很好的类比是线程与协程的关系就像CPU核心与线程的关系一样:

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


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

    Kotlin协同程序是否会在必要时(当需要多个内核时)自动生成线程?或者只是协同程序上下文产生线程?协同程序本身与线程无关。挂起的协同程序只不过是一个带有
    resume()
    方法的普通Java对象。所有线程操作都在协程调度程序(上下文的一部分)中。
    UI
    dispatcher从不生成线程,它只是将协程提交给UI线程
    Unconfined
    只是在调用线程上恢复协同路由。即使是
    CommonPool
    本身也不会生成线程,只是将协同路由提交给一个全局
    ExecutorService
    ,然后该服务将执行它配置为执行的任何操作。