Coroutine是编译器级的,Process和Thread是操作系统级的。

    @RestrictsSuspension 注解

    kotlinx.coroutines 框架

    kotlin挂起分析

    协程 - 图1


    • 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空间,协程是在用户空间