前言
相信很多人都听过或者看到过这样一种说法“协程是一种轻量级的线程”。以下文档中都有类似的描述:
-
本质上,协程是轻量级的线程。
-
Essentially, coroutines are light-weight threads.
显然,翻译很准确
问题在哪
相信很多人了解过Kt协程都看过上线官方的这个描述。
因而很多人觉得协程比线程牛逼,因为是”轻量级“。所以有人觉得协程是另一种方式实现的类似线程的功能,所以产生了以下对话:
A:Kotlin协程和线程有啥区别
B:协程是对线程操作的封装,通过状态机和回调实现以同步样式代码书写异步逻辑,消除回调低于,更便于理解,巴拉巴拉。。。
A:内存消耗上有啥区别?
B:内存消耗上如果线程和协程比的话协程更占优势,因为协程底层实现是类似线程池,有线程复用,所以更省内存,如果是线程池和协程比较,实际上并无太大区别。
A:这和我的理解不太一样呢,我的理解是协程是通过编译器实现的,所以比线程更节省内存,比如我开100w个线程和100w个协程,线程会oom,协程不会
协程是什么
广义上的协程是一个**概念(协程是一种非抢占式或者说协作式的计算机程序并发调度)**而不是一个具体的框架。
Kt中的协程是Kt对协程概念的一种具体实现。
Kt协程和线程
Kt协程被官方描述为轻量级线程。
那它跟线程到底是什么关系呢,是包含封装关系还是功能类似的两种不同的实现方式呢?
康康源码?show me the fucking code!!
协程的切换线程必然要使用到Dispatchers中的几个变量
public actual object Dispatchers {
@JvmStatic
public actual val Default: CoroutineDispatcher = createDefaultDispatcher()
@JvmStatic