Coroutine是编译器级的,Process和Thread是操作系统级的。
@RestrictsSuspension 注解
kotlinx.coroutines 框架
kotlin挂起分析
- newSingleThreadContext()
- newFixedThreadPoolContext()
挂起函数
挂起 suspend,非阻塞
CoroutineStart
协程启动选项
- DEFAULT
- LAZY
协程上下文,就是代码块执行在哪个场景。
- CoroutineContext.Key
- AbstractCoroutineContextElement
- EmptyCoroutineContext
CoroutineScope
- isActive
- context
CoroutineDispatcher
调度器
- HandlerContext
- Unconfined
- dispatch(context: CoroutineContext, block: Runnable)
Job
后台任务,持有该协程的引用。非阻塞。
Job launch()
Deferred async()
方法声明 | 功能描述 |
---|---|
isActive | |
isCompleted | |
cancel() | 取消协程任务 |
join() | 让主线程一直等到当前协程执行完毕再结束 |
- DeferredCoroutine
- LazyDeferredCoroutine
挂起的协程可以作为保持其挂起状态与局部变量的对象来存储和传递。这种对象的类型是 Continuation
方法声明 | 功能描述 |
---|---|
context | CoroutineContext上下文 |
resume() | 传给resume的参数会变成suspendCoroutine的返回值 |
resumeWithException() |
ContinuationInterceptor
拦截器,可以把协程的操作拦截
- interceptContinuation()
协程的基本操作
包级函数
suspendCoroutine的作用就是将当前执行流挂起, 在适合的时机再将协程恢复执行, 我们可以看到他的参数是一个lambda, lambda的参数是一个Continuation,Continuation了, 它表示一段执行流。Continuation实例代表的执行流是从当前的suspension point开始, 到下一个suspension point结束, 当前的suspension point就是调用suspendCoroutine这一刻.
在Kotlin内部, 协程被实现成了一个状态机, 状态的个数就是suspension point的个数+1(初始状态), 当前的状态就是当前的suspension point, 当调用resume时, 就会执行下一个Continuation.
Channel
- SendChannel
- ReceiveChannel
- Channel
方法声明 | 功能描述 |
---|---|
isClosedForSend | |
isClosedForReceive | |
send() | |
receive() | |
close() | 关闭通道 |
状态机
对具有逻辑顺序或时序规律事件的一种描述方法。
- 有限状态机
- 两种状态机:Moore型和Mealy型
协程与协程的区别
- 线程是抢占式的,协程是非抢占式的
- 线程是操作系统层面的,协程是编译器级的,应用层面,由虚拟机调度
- 线程是在kernel空间,协程是在用户空间