抽丝剥茧聊Kotlin协程之聊聊Job和SupervisorJob的区别

2023-05-16

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如何建立父子关系一文,讲解过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就相当于一个严厉的老板,子协程自己犯的错,自己解决。

协程异常的处理机制非常复杂,已经超出了本文的范围,我会在我的知识星球,另开一文讲解。

5. 这就够了吗?

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

  1. CancellationException和其它Exception的区别
  2. coroutineScope与SupervisorScope的区别

记得关注"字节小站" 公众号获取更多干货知识~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

抽丝剥茧聊Kotlin协程之聊聊Job和SupervisorJob的区别 的相关文章

随机推荐

  • 汇编总结:lea指令

    ea指令变种 按大小分类 leaw 2个字节 leal 4个字节 leaq 8个字节 lea的用法 leaq a b c d rax 首先lea指令是mov指令的变种 xff0c 据说 xff0c lea指令是x86体系结构中 xff0c
  • CMake语法—选项(option)

    CMake语法 选项 xff08 option xff09 1 选项 1 1 定义 1 2 说明 variable 选项名help text 描述 解释 备注value 选项初始化值 xff08 除ON而外全为OFF xff09 2 应用注
  • C++工程:总结 CMake 添加第三方库依赖方式git submodule、 find_library、FetchContent、CPM等

    CMake 已经成为了C 43 43 工程管理的主流方式 xff0c 功能非常强大 xff0c 现在大多数的 C 43 43 库都已经支持CMake xff0c 下面以 jsoncpp 为例 xff0c 介绍几种引入第三方库的方式 1 代码
  • 医学图像——DCMTK、VTK、ITK、RTK、SimpleITK

    1 引言 https github com SINTEFMedtek ITK VTK xff0c 相关童鞋应该很熟悉的 xff0c 而CTK是一个较新的界面库 xff0c 主要用于方便前面两个 TK的界面设计 xff0c 当然也可以作为通用
  • C++中的volatile

    volatile的本意是 易变的 volatile关键字是一种类型修饰符 xff0c 用它声明的类型变量表示可以被某些编译器未知的因素更改 xff0c 比如操作系统 硬件或者其它线程等 遇到这个关键字声明的变量 xff0c 编译器对访问该变
  • 3DTiles】关于GeometricError几何度量误差

    在 3DTiles 的官方文档中详细介绍了关于几何度量误差 Geometric Error 的一些理念和内涵 xff0c 概括来说可以翻译为如下定义 xff1a 几何度量误差 xff0c Geometric Error xff0c 简称 G
  • glPixelStorei 详解 包括像素传输

    3 glPixelStore 像glPixelStorei GL PACK ALIGNMENT 1 这样的调用 xff0c 通常会用于像素传输 PACK UNPACK 的场合 尤其是导入纹理 glTexImage2D 的时候 xff1a C
  • ESLint 简介

    ESLint简介 ESLint是一个用来识别 ECMAScript 并且按照规则给出报告的代码检测工具 xff0c 使用它可以避免低级错误和统一代码的风格 如果每次在代码提交之前都进行一次eslint代码检查 xff0c 就不会因为某个字段
  • IOS VasSonic 粗略见解

    因为项目需求需要在本地缓存html页面 xff0c 优化用户体验 了解到VasSonic 百度了下源码解析但是没有发现IOS的所以只有自己慢慢摸索了 一 类的简单关系 1 SonicEngine 引擎类 代理为 UIWebViewContr
  • axios的详细讲解

    一 axios的特性 axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端 xff0c 简单的理解就是ajax的封装 特性 xff1a 从浏览器中创建 XMLHttpRequests从 node js 创建
  • 无人机飞控算法-姿态估计-欧拉角-旋转矩阵-四元数

    无人机飞控算法 姿态估计 此系列记录了我理解的卡尔曼滤波从0到1的过程 xff0c 从姿态估计到位置估计 xff0c 我们从核心点一个个出发 xff0c 并结合实际模块的应用来一一揭开卡尔曼滤波的神秘面纱 提示 xff1a 在系列文章中 x
  • BMP格式详解

    介绍 数字图像在外存储器设备中的存储形式是图像文件 xff0c 图像必须按照某个已知的 公认的数据存储顺序和结构进行存储 xff0c 才能使不同的程序对图像文件顺利进行打开或存盘操作 xff0c 实现数据共享 图像数据在文件中的存储顺序和结
  • WinHex使用方法详解

    WinHex是由X Ways软件技术公司 xff08 官方网站http www x ways net xff09 开发的一款专业的磁盘编辑工具 xff0c 该工具文如其名 xff0c 是在Windows下运行的十六进制 xff08 hex
  • three.js流动线

    效果 xff1a 先看最基本的 function initThree el options options 61 options const t 61 this appInstance 61 this const width 61 el o
  • OpenGL之FBO(Frame Buffer Object)和多次离屏渲染

    第一次听到离屏渲染的时候觉得很高级 xff0c 遥不可及 xff0c 直到后来做高斯模糊的时候 xff0c 需要通过两次处理来节省性能 xff0c 一直玩一次渲染处理的我这时候才认识FBO xff0c 继而明白了离屏渲染 xff0c 今天抽
  • Android驱动(一)硬件访问服务学习之(四)Android应用程序APP编写

    硬件平台 xff1a tiny4412系统 xff1a Android 5 0 2编译器 xff1a arm linux gcc 4 5 1 xff08 一 xff09 Android通过JNI访问硬件 http blog csdn net
  • gl_FragCoord 的含义

    gl FragCoord 表示当前片元着色器处理的候选片元窗口相对坐标信息 xff0c 是一个 vec4 类型的变量 x y z 1 w xff0c 其中 x y 是当前片元的窗口坐标 xff0c OpenGL 默认以窗口左下角为原点 xf
  • RoboMaster机甲大师——视觉组——计算平台的选型与感想(主流几款)

    RoboMaster机甲大师 视觉组 计算平台 xff08 工控机 xff09 的选型与感想 xff08 主流几款 xff09 FOR THE SIGMA FOR THE GTINDER FOR THE ROBOMASTER 简介 xff1
  • 如何在Linux命令行下发送和接收UDP数据包

    众所周知 在传输层有两个常用的协议 TCP 和 UDP 本文介绍在 Linux 命令行下 如何使用 nc 命令发送或接收 UDP 数据包 这些命令的用法对调试 UDP 通信程序将有所帮助 1 问题的提出 编写了一个使用 raw socket
  • 抽丝剥茧聊Kotlin协程之聊聊Job和SupervisorJob的区别

    1 前言 随着协程的普及 xff0c 协程知识越来越被面试官青睐 首先 xff0c 协程的面试题一般都很简洁 xff0c 一两句简单的话就能把问题描述清楚 xff0c 其次于面试官而言 xff0c 协程框架中精妙的数据结构与算法可以很好的考