协程
文章平均质量分 97
Super-B
这个作者很懒,什么都没留下…
展开
-
kotlin coroutine源码解析之Dispatchers协程调度器
1. Dispatchers的四种调度器是饿汉式单例对象,所以一个进程只存在一个实例对象。2. Dispatchers的四种调度器中,IO和default是共用的一个线程池,它的实现是CoroutineScheduler。3. CoroutineScheduler线程池,有一个保存线程的队列,有两种全局任务队列:一个是IO阻塞型队列,一个是cpu密集型任务队列;Worker线程拥有一个本地任务队列。原创 2022-11-20 16:41:21 · 2029 阅读 · 0 评论 -
kotlin coroutine源码解析之suspend挂起函数原理
1. 父JobA的lambda表达式中有挂起函数,协程会在父JobA的挂起点处创建一个CancellableContinuationImpl类型的continuation,这个Cancellable会和父JobA进行父子关联;如果挂起函数本身是某个JobB的挂机函数,那么Cancellable还会和JobB组成父子关系,JobB在结束自己的时候,会通知Cancellable自己完成了,Cancellable又会继续通知JobA继续执行lambda的代码块,这样JobA就从挂起点恢复过来了。原创 2022-11-17 11:49:36 · 1488 阅读 · 0 评论 -
kotlin coroutine源码解析之Job取消以及异常的处理流程分析
异常的传导链,从子Job向父Job传导:如果父Job是supervisorJob的话,将不做处理,需要子Job自己处理;如果父Job是JobSupport的话,异常还会继续向父Job的父Job传递,直到根部Job。所以捕获异常的话在根ScopeCoroutine里面设置就比较合适,对于有supervisorJob的情况,需要在supervisorJob的子Job中设置异常处理器,supervisorJob自己不会处理异常。原创 2022-11-16 00:10:41 · 1645 阅读 · 0 评论 -
kotlin coroutine源码解析之Job启动流程
dispatcher调用的是DIspatchedTask.run方法,(dispatcher是一个线程池和java线程池类似,但是有一点区别,后面章节再讲),run方法中,首先获取delegate,然后取出continuation变量,这个delegate其实是被DispatchedContinuation覆写的,而且实现的Continuation接口被构造函数的continuation代理,这个入参continuation其实就是ContinuationImpl,上一步分析过了。原创 2022-11-13 20:49:54 · 734 阅读 · 0 评论 -
kotlin coroutine源码解析之coroutineContext篇
表示一个元素或者是元素集合的接口。它有一个Key(索引)的Element实例集合,每一个Element的实例也是一个CoroutineContext,即集合中每个元素也是集合。原创 2022-11-06 16:51:47 · 1059 阅读 · 0 评论