协程是什么
首先, 协程是一片包含特定逻辑的代码块, 这个代码块可以调度到不同的线程上执行;
其次, 协程一种环境, 在这种环境里, 方法可以被等待执行, 有了运算结果之后才返回, 在等待期间, 承载协程的线程资源可以被别的地方使用.
第三, 协程是一个独立于运行流程的逻辑流程, 协程里面的步骤, 无论是同步的还是异步的, 都是线性(从前到后依次完成的).
协程和线程区别与关系
线程和协程的目的本质上存在差异:
线程的目的是提高CPU资源使用率, 使多个任务得以并行的运行, 所以线程是为了服务于机器的.
协程的目的是为了让多个任务之间更好的协作, 主要体现在代码逻辑上, 所以协程是为了服务于人的, 写代码的人. (也有可能结果会能提升资源的利用率, 但并不是原始目的)
在调度上, 协程跟线程也不同:
线程的调度是系统完成的, 一般是抢占式的, 根据优先级来分配, 是空分复用.
协程的调度是开发者根据程序逻辑指定好的, 在不同的时期把资源合理的分配给不同的任务, 是时分复用的.
作用上的不同:
协程确保了代码逻辑是顺序的, 不管同步操作要是异步操作, 前一个完成, 后一个才会开始.
线程可以被调度到CPU上执行, 这样代码才能真正运行起来.
协程与线程的关系:
协程并不是取代线程, 而且抽象于线程之上, 线程是被分割的CPU资源, 协程是组织好的代码流程, 协程需要线程来承载运行, 线程是协程的资源, 但协程不会直接使用线程, 协程直接利用的是执行器(Interceptor), 执行器可以关联任意线程或线程池, 可以使当前线程, UI线程, 或新建新程. 可总结如下:
线程是协程的资源.
协程通过Interceptor来间接使用线程这个资源.
参考文档:kotlin协程理解
网友评论