【深入kotlin】- 协程

本文深入探讨了Kotlin中的协程,包括CoroutineScope的概念,协程上下文和分发器的作用。重点讲述了Dispathchers.Default、Dispatchers.IO、Dispatchers.Main和Dispatchers.Unconfined四种分发器的特性,以及Unconfined分发器如何受挂起函数影响,导致执行线程的变化。同时,提到了单线程池在协程中的应用和可能导致的程序阻塞问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

协程是一个类似于线程的概念,但也不完全相同,它是一种轻量级的线程,它比线程的概念更小,功能更加强大,方便我们以顺序执行的方式进行异步编程。一个线程可以拥有若干个协程,协程可以进行执行、挂起、延迟等操作。通过协程,我们可以获得比线程更大的控制权,却只需付出更低的代价。

CoroutineScope

CoroutineScope 接口代表了协程的概念。GlobalScope 是其中一个实现。CoroutineScope 只有一个属性 coroutineContext,表示协程上下文。

协程上下文/协程分发器

CoroutineContext (协程上下文)是一个接口,用于描述协程的运行环境。它有两个重要属性: job 和 Dispather(分发器)。其中,job用于表示协程所要做的工作,分发器用于表示协程的执行线程。所有的协程构建器,如 luanch,async 都会接受一个可选的 CoroutineContext 参数。该参数用于指定协程上下文,注意,协程分发器间接继承(实现)了 CoroutineContext,因此有时候可以直接把 CoroutineDispatcher 传递给这个 CoroutineContext 参数。协程分发器用于指定协程的执行线程线程池。CoroutineDispatcher 抽象类有 4 种标准实现(当然也可以自己实现):

  • Dispathcers.Default 默认线程池(这个线程池中至少有两个线程,最多可以与 CPU 数相同),默认会从后台线程中分配一个线程
  • Dispatchers.IO 分配一个专用于 IO 的线程
  • Dispatchers.Main 分配主线程,即 APP 的主线程
  • Dispatchers.Unconfined 不限制,即不指定线程,则运行于当前线程

查看 launch 的源代码,你会看到:

public fun CoroutineScope.launch(
  context: CoroutineContext = EmptyCoroutineContext,
  start: CoroutineStart = CoroutineStart.DEFAULT,
  block: suspend CoroutineScope.()->Unit
): Job {
   
   

除了最后一个尾随闭包参数,launch 还有 2 个默认值参数,所以通常我们都不需要传递这两个参数。其中,第一个参数 context 就是一个协程上下文,默认值是一个 EmptyCoroutineContext。第二个参数指定协程创建后的启动方式。

fun main() = runBlocking {
   
   
	launch {
   
   // 使用默认上下文
    println(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值