关于面试:协程面试题聊聊Job和SupervisorJob的区别

57次阅读

共计 1819 个字符,预计需要花费 5 分钟才能阅读完成。

1. 前言

随着协程的遍及,协程常识越来越被面试官青眼。首先,协程的面试题个别都很简洁,一两句简略的话就能把问题形容分明,其次于面试官而言,协程框架中精妙的数据结构与算法能够很好的考查应聘者对基础知识的把握水平。绝对于烂大巷的 Android 八股文,它又能很好的考查应聘者的被动学习能力。所谓里手一伸手便知有没有。协程常识便是面试场景中的里手和试金石。闲话少叙,本文带大家聊聊 Job 和 SupervisorJob 的区别。

2. Job 和 SupervisorJob 的区别

如果你看过协程的官网文档或视频。你应该会晓得 Job 和 SupervisorJob 的一个区别是,Job 的子协程产生异样被勾销会同时勾销 Job 的其它子协程,而 SupervisorJob 不会。

Job 启动了 3 个子协程 job1、job2、job3。job1 delay 100 毫秒后产生异样,协程被勾销了,job2 和 job3 也同样被勾销了。

SupervisorJob 启动了 3 个子协程 job1、job2、job3。job1 delay 100 毫秒后产生异样,协程被勾销了,job2 和 job3 并不受影响。

3. 原理

有过面试经验的敌人应该都晓得,面试官喜爱问原理。为什么 Job 和 SupervisorJob 有这样的区别呢?

源码中寻找答案。Job() 返回的是 JobImpl 对象,SupervisorJob() 返回的 SupervisorJobImpl 对象。而 SupervisorJobImpl 是 JobImpl 的子类,并且重写了 childCancelled 办法,返回值为 false。JobImpl 继承自 JobSupport,它的 childCancelled 办法源码如下:

启动协程的 Job 会和协程自身的 Job 造成父子关系。当协程被勾销时,会调用父 Job 的 childCancelled 办法。SupervisorJobImpl 间接返回 false,示意父 Job 不会因为子 Job 被勾销而追随勾销。而 JobSupport 会调用 cancelImpl 办法,该办法的作用是勾销父 Job 和父 Job 的所有子 Job。

4. 异样解决的区别

祝贺你,后面的问题你都侥幸的过关了,正当你暗自庆幸的时候。面试官可能会诘问,请问除了子 Job 的勾销不同,还有其它的区别吗? 当然有了,比方异样解决机制不一样,Job 形式启动的协程如果产生异样,异样会沿着 Job 树始终往上传递,而 SupervisorJob 形式启动的协程产生异样,SupervisorJob 会将异样交由给协程解决 。这么一说有点形象,看个例子。

演示协程嵌套,两头有 Job 类型启动的协程时,如果子协程产生异样,异样会交由根协程解决。

演示协程嵌套,两头有 SupervisorJob 类型启动的协程时,如果子协程产生异样,异样会交由子协程解决。

答复自此,暗自心想,这下挑不出故障吧,哪知面试官接着诘问,请问原理是什么呢?答案当然要从源码中找寻了。

代码 1 处,是解决异样的外围逻辑,它首先判断 cancelParent 的返回值,如果返回 false,就调用 handleJobException。

cancelParent 办法的含意是,当子协程处产生异样,那么它会尝试勾销它的父协程,如果返回 true 示意父协程也被勾销,反之示意不能取消父协程,而 cancelParent 最终也有可能调用代码 2 处的 parent.childCancelled 办法。

异样的解决逻辑能够用职场的例子解释。假如职场的潜规则是,任何员工出错了,首要是要向下级报告,如果下级违心解决你的谬误,那员工就不必管了,如果下级将问题打回给员工,那谬误就得由员工本人解决

那么回到问题自身,Job 就相当于一个好老板,子协程犯的错,它违心解决,SupervisorJob 就相当于一个严格的老板,子协程本人犯的错,本人解决

行文至此,Job 和 SupervisorJob 搞清楚了。然而还有很多其它的问题,比方:

  • CancellationException 和其它 Exception 的区别
  • coroutineScope 与 SupervisorScope 的区别

我整顿了一些学习材料,外面包含 Java 根底、Android 进阶、架构设计、NDK、音视频开发、跨平台、底层源码等技术,还有 2022 年一线大厂最新面试题集锦,都分享给大家,助大家学习路上乘风破浪~ 能力失去晋升,思维失去宽阔~ 有须要的能够点击下方链接支付

链接:https://shimo.im/docs/R13j85m…

正文完
 0