Kotlin 协程(一)
Kotlin 协程 (二)协程取消与超时
Kotlin 协程(三) async和await
所有的协程都是在上下文中运行,而协程上下文包含一个协程调度器.
协程调度器确定了相关的协程在哪个线程或哪些线程上执行,协程调度器可以将协程限制在一个特定的线程执行,或将它分派到一个线程池,亦或是让它不受限地运行.
协程调度器源码:
public actual object Dispatchers {
@JvmStatic
public actual val Default: CoroutineDispatcher = createDefaultDispatcher()
@JvmStatic
public actual val Main: MainCoroutineDispatcher get() = MainDispatcherLoader.dispatcher
@JvmStatic
public actual val Unconfined: CoroutineDispatcher = kotlinx.coroutines.Unconfined
@JvmStatic
public val IO: CoroutineDispatcher = DefaultScheduler.IO
}
从源码可以得知
Main 是运行在主线程的及在Android中进行UI绘制的线程.一般用于处理UI绘制及一些轻量级任务
Default 是运行在非主线程的,一般用于CPU密集型计算型任务.如数组排序,JSON解析,异常判断等
IO 是运行在非主线程的,一般用于磁盘操作和网络IO操作任务.如数据库操作,文件读写,网络请求等
Unconfined 未定义的线程,是一个特殊的调度器且似乎也运行在 main 线程中,但实际上它是一种不同的机制.协程调度器在调用它的线程启动了一个协程,但它仅仅只是运行到第一个挂起点.挂起后,它恢复线程中的协程,而这完全由被调用的挂起函数来决定.非受限的调度器非常适用于执行不消耗 CPU 时间的任务,以及不更新局限于特定线程的任何共享数据(如UI)的协程



