协程是可以由程序自行控制挂起 恢复的程序
协程可以用来实现多任务的协作执行
协程可以用来解决异步任务控制流的灵活转移
可以让异步代码同步化
可以降低异步程序的设计复杂度
异步逻辑 同步写法
协程的分类
按调用栈
有栈协程:每个协程会分配单独的调用栈 类似线程的调用栈
无栈协程 挂起点状态通过闭包或者对象保存
按调用关系
对称协程:调度权可以转移给任意协程 协程之间对等关系
非对称协程 调度权只能转移给调用自己的协程 协程之间存在父子关系
Kotlin协程的基本要素
挂起函数 suspend修饰的函数,只能在其他挂起函数或者协程中使用,
挂起函数调用同时包含了协程“挂起”的语义
挂起函数返回时则包含了协程“恢复的”语义
恢复:Continutation
suspend fun bar(a:Int):String{//方法2是方法1编译后的 continuation的泛型参数是方法的返回类型
return "hello"
}
fun bar1(a:Int,continuation: Continuation<String>):Any{//any在没有挂起时返回函数返回值,在挂起时返回挂起标志
return "hello" //
}
协程的创建
协程是一段可执行的程序 需要一个函数 还需要一个API
协程上下文
协程执行过程中需要携带数据
索引是CoroutinContext,Key
元素是CoroutinContext.Element
拦截器
拦截器ContinuationIneterceptor是一类协程上下文元素
可以对协程上下文所在协程的Continuation进行拦截
拦截器负责进行线程的切换