协程的基本概念
协程定义
它是一种用户态的轻量级线程,协程的调度完全由用户控制。它有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁地访问全局变量,所以上下文的切换非常快。协程虽然是微线程,但并不会和某一个线程绑定,它可以在A线程中执行,经过某一个时刻的挂起,等下次调度到恢复执行的时候,很可能会在B线程中执行。
线程和协程的区别
线程的阻塞代价是昂贵的,而协程使用了更简单、代价更小的挂起来代替阻塞
协程常用基本概念
1.CoroutineContext
协程上下文,它包含一个默认的协程调度器,所有协程都必须在CoroutineContext
2.CoroutineScope
协程作用域,它一个接口只包含一个属性coroutineContext。它定义了一个协程的作用范围。每个Coroutine builder都是CoroutineScope的扩展,CoroutinesScope会在具有生命周期的实体上实现。Kotlin定义一个全局的作用域GlobalScope,用于启动顶级的协程,这些协程会在整个应用程序生命周期内运行
3.CoroutineDispatcher
协程调度器,它用来调度和处理任务,决定了相关协程应该在哪个或哪些线程中执行,kotlin的协程包含多种协程调度器
4.Suspend
关键字,协程可以被挂起而无需阻塞线程。我们使用suspend关键字来修饰可以被挂起的函数。被标记为suspend的函数只能运行在协程或者其他suspend函数中。suspend可以修饰普通函数、扩展函数和Lambda表达式
5.suspension point
协程每个挂起的地方是一个suspension point
6.Continuation
字面意思是继续、持续的意思。由于协程可能是分段执行的:先执行一段,挂起,再执行一段,再挂起…相邻的两个suspension point之间被称为Continuation。Continuation用来表示每一段执行的代码,一个完整的协程程序包含多个Continuation
7.Job
任务执行的过程被封装成Job,交给协程调度器处理。

本文详细探讨了协程的概念、线程区别、关键概念如CoroutineContext、CoroutineScope和Dispatcher,以及常用的CoroutineBuilders如launch、async和runBlocking。重点讲解了挂起函数、延迟与yield,以及CoroutineDispatcher的不同实现。
最低0.47元/天 解锁文章
769

被折叠的 条评论
为什么被折叠?



