Kotlin 协程基础入门:Job和协程的生命周期

一文快速入门 Kotlin 协程 外链图片转存中…(img-kEqsXMOM-1711933009616)][外链图片转存中…(img-i14vWA24-1711933009617)][外链图片转存中…(img-3PD0Q5mT-1711933009617)][外链图片转存中…(img-5lZCRSvS-1711933009617)][外链图片转存中…(img-deL12ekO-1711933009618)] 阅读详情

其他相关文章
Kotlin 协程基础入门:协程的三种启动方式和挂起函数
Kotlin 协程基础入门:协程的上下文 Context (万物皆为Context)
Kotlin 协程与 Channel(通道)
Kotlin 协程与 Flow


Job简介
在 Kotlin 协程中,一个 Job 对象是一个代表正在执行的异步操作的任务,可以用它来控制与取消协程的执行,是协程执行的核心组件之一。

不同协程创建方式下的返回值

  1. 使用 launch 函数创建协程
//返回 Job
val job = GlobalScope.launch {
    // 协程体
}
  1. 使用 async 函数创建协程
//返回 Deferred<T>
val deferred = GlobalScope.async {
    // 协程体
}
  1. 使用 runBlocking 函数创建协程
//返回 Unit
runBlocking {
    // 协程体
}
  1. 使用 withContext 函数创建协程

用于在协程中切换线程,如在后台线程中执行异步操作,然后返回结果到 UI 线程更新 UI。

//返回被 suspend 修饰的异步函数的返回值
val result = withContext(Dispatchers.IO) {
    // 在 IO 线程中执行异步操作,并返回结果
}

在以上协程创建方式中,Job 对象都被自动管理,开发者无需显式管理,但是可以通过 Job 对象的方法来控制协程的执行,如取消和等待,相当于协程的句柄。

由上面代码可知,通过 launch 函数创建的协程会返回一个 Job 对象。在协程执行完成后,无法获取协程执行的结果。

Job

主要方法:

cancel() 用于取消协程的执行,如果协程已经处于完成状态则无法取消,返回false
join() 等待协程执行完成。该方法是一个挂起函数,会阻塞当前协程,直到被调用的协程执行完成。
invokeOnCompletion() 注册一个回调函数,在协程完成时执行,返回值是一个 DisposableHandle 对象,用于取消这个回调的注册。
onCancel() 注册一个回调函数,在协程被取消时执行。返回值是一个 DisposableHandle 对象,用于取消这个回调的注册。
getChildJob() 创建一个新的子 Job 对象,并将其添加到当前的 Job 上下文中。返回新创建的 Job 对象。
start() 启动协程执行,并返回 true。如果 Job 已经开始执行,则返回 false。

属性:

children 返回当前 Job 的所有子 Job 的序列。
isActive 判断当前 Job 是否处于活动状态,即协程是否正在运行中。
isCancelled 判断当前 Job 是否被取消。
key 获取 Job 在协程上下文中对应的键。
parent 获取当前 Job 的父 Job 对象,如果当前 Job 没有父 Job,则返回 null。
children 返回当前 Job 的所有子 Job 的序列。

生命周期及状态

Job 对象的生命周期可以被描述为以下几个状态:

  • New:协程已创建,但尚未启动。
  • Active:协程正在运行中。
  • Completing:协程已执行完了自己的任务(但可能在等待其子协程完成)。
  • Cancelling:协程正在等待取消操作完成。
  • Cancelled:协程已经被取消,但它的子协程可能仍在运行。
  • Completed:协程已经完成,并不存在需要等待的子协程。

在协程的执行过程中,可以通过 Job 对象上的各种方法来检测协程的状态变化,包括:

  • isActive:检测 Job 是否处于激活状态(即正在运行中),返回 true 或 false。
  • isCompleted:检测 Job 是否已经完成,返回 true 或 false。
  • isCancelled:检测 Job 是否已经被取消,返回 true 或 false。
  • invokeOnCompletion:注册在 Job 完成时执行的回调函数(即协程执行成功或失败时执行的操作)。

Deferred

Deferred 是一种特殊的 Job(继承自 Job 的一个接口),它代表了一段可能产生结果(即返回值)的协程代码。当协程执行成功时,它返回的结果可以通过 Deferred 的 await 方法获取。
await ()
Deferred 的 await 方法是一个挂起函数,它挂起当前协程的执行,直到所关联的协程执行完成并返回结果或者抛出异常。如果协程抛出了异常,则 await 方法会在当前协程中重新抛出该异常。如果协程成功完成,await 方法会返回对应的值。

例如,如下代码所示,启动一个协程执行异步的计算任务,并通过 Deferred 的 await 方法获取结果:

val deferred = async {
    // 异步计算任务
    // ...
    return@async result // 返回计算结果
}
val result = runBlocking {
    deferred.await() // 等待异步计算任务完成,并返回结果
}

Job的层级关系和结构化并发

具体来说,每个 Job 对象可以关联一个或多个子 Job 对象。这些子 Job 对象可以代表当前协程内部启动的其他协程,或者代表协程启动的某个分支。
当一个父 Job 被取消时,所有的子 Job 都会被自动取消。这种自动取消称为结构化并发,可以避免因子任务的报错或取消而造成的数据错误和资源泄漏等问题。
多说的不说,直接上示例

fun main() = runBlocking<Unit> {
  println("start main coroutine")

  val parentJob = launch {
    println("job start")

    coroutineScope {
      launch {
        delay(200)
        println("job1 finished")
      }

      launch {
        delay(500)
        println("job2 finished")
      }
    } 

    println("job end")
  }

  parentJob.join()

  println("end main coroutine")
}


/// 打印结果
start main coroutine
job start
job1 finished
job2 finished
job end
end main coroutine
///

上述代码中,使用 launch() 启动一个协程任务,并在其中启动了两个子协程任务。这两个子协程会自动成为当前父协程的子协程,当父协程被取消时,这两个子协程也会被自动取消。
可以看到,协程任务执行的顺序是从 job start => job1 finished => job2 finished => job end,这是因为在 coroutineScope 中启动的子协程任务是并发执行的。

调用 parentJob 的 join() 方法,它会等待其内部 job1 和job2 全部执行完毕,才会恢复执行

如果把 parentJob.join() 换成 parentJob.cancel() 那么结果就会变成下面这种情况,其内部的协程被全部取消

/// 打印结果
start main coroutine
end main coroutine
///

所以,当我们以结构化的方式构建协程以后,我们的 join()、cancel() 等操作,也会以结构化的模式来执行。

Kotlin中协程的基本使用 1.协程的创建方式 1.使用 launch() 实例如下: GlobalScope.launch { delay(3000) } launch()函数的源代码如下: public fun CoroutineScope.launch( context: CoroutineContext = EmptyCoroutineContext, start: ... 阅读详情

相关推荐

欧姆龙OMRON PLC之HostLink通讯协议(四)-FINS命令进阶应用与调试技巧

本文深入探讨欧姆龙OMRON PLC的HostLink通讯协议中FINS命令的进阶应用与调试技巧。文章聚焦实战排错,详细解析命令帧解剖、响应帧解读与网络抓包三大核心方法,并分享性能优化策略,如合并读写与异步设计。同时介绍了强制操作、多存储区访问等高级命令的应用场景,旨在帮助工程师高效解决现场通讯问题,提升系统稳定性与效率。

nept的博客 750

Kotlin - 协程结构化并发Structured Concurrency

Structured Concurrency的典型作用:协程的cancel。(可能传入一个CoroutineDispatcher),也就是我们现在所熟悉的协程版本所具备的特性,解决。EMPTY_NEW和 EMPTY_ACTIVE。那context + Job()自己的state内的list传递。Concurrency的具体。这就是所谓的对协程生命周期。只能在Coroutine。Job作为Child加入。Job(后者外部传入),自己的分支cancel。

temp7695的博客 1681

IPV6基本配置

IPV6配置,DHCPV6,华为模拟器,IPV6的M/O标志位

路漫漫其修远兮 4666

Kotlin 协程 Job

Job 是协程的句柄。对于您创建的每个协程(通过启动 launch 或异步 async),它都会返回一个 Job (Deferred也是一种类型的 Job)实例,该实例唯一标识该协程并管理其生命周期Job 可以经历一组状态:新建、活动、完成、已完成、取消和已取消。虽然我们无法访问状态本身,但我们可以访问作业的属性:isActive、isCancelled 和 isCompleted。

idea0的博客 1769

别再写前端了!用Gradio 3.x + HuggingFace Spaces,5分钟把你的Python算法变成网页应用

本文介绍如何利用Gradio 3.x和HuggingFace Spaces快速将Python算法转化为网页应用,无需前端开发经验。通过5行代码和简单的Git命令,即可实现专业级Web界面部署,大幅提升算法展示效率。特别适合算法工程师和数据科学家快速分享模型成果。

weixin_33443333的博客 332

Unity雷达图效果实现

unity雷达图源码

a604263644的博客 1026

【深入理解Kotlin协程】使用Job控制协程的生命周期

Job 是协程上下文CoroutineContext的实现之一,我们通过Job可以获取当前协程的运行状态,还可以随时取消协程。 Job 是协程的 句柄。使用 launch 或 async 创建的每个协程都会返回一个 Job 实例对象,该实例是相应协程的唯一标识并管理其生命周期。还可以将 Job 传递给 CoroutineScope 以进一步管理其生命周期。

川峰的博客 2374

网易数智CoreAgent实战:5步教你打造企业级AI数字员工(附避坑指南)

本文以网易数智CoreAgent智能体协作中枢为核心,提供了一份企业级AI数字员工的实战部署指南。文章详细拆解了从环境准备、智能体配置、业务集成、安全合规到效果评估的五个关键步骤,并分享了部署过程中的常见“避坑”经验,旨在帮助企业技术团队高效、安全地将AI智能体落地于实际业务场景,解决AI落地难题。

rice5的博客 954

Kotlin协程核心库分析-2 Job简述

未完待续。。 Job是标准库中启动协程后返回的对象,代表着协程本次作业。我们可以判断协程是否结束,是否取消,是否完成并且可以取消当前协程以及嵌套子协程。 我们简单的看下面的代码如何获取job对象 fun main() { val job = GlobalScope.launch { } //协程是否存活 job.isActive //是否取消 ...

不会写代码的丝丽 2733

基于STM32L4XX 、HAL库的TMP144YFFR数字温度传感器驱动应用C语言程序设计

define TMP144_ADDRESS 0x00 // 默认为全局地址,用于单器件或MDA命令。#define TMP144_CMD_READ_TEMP 0x00 // 读取温度寄存器命令。if (temp_raw & 0x800) { // 判断第11位(符号位)

PP_Cottage的博客 91

从 OPEN CURSOR 到 SELECT INTO TABLE:把 ABAP 数据读取的底层机制与性能差异讲透

ABAP数据库访问性能优化关键点 摘要:ABAP程序性能的核心在于数据读取方式的选择。本文分析了三种常见数据库访问方式的技术原理:显式游标(CURSOR)、SELECT-ENDSELECT循环和SELECT INTO TABLE。重点揭示了数据从数据库到应用服务器的传输机制,包括OPEN/REOPEN与FETCH操作、Array Fetch批量传输原理以及SAP游标缓存机制。通过VBAK表的性能测试数据对比,证明了不同场景下最优访问方式的选择依据:大数据量时显式游标性能优势明显,而SELECT INTO T

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 172

Kotlin协程详解——Job

基本上每启动一个协程就会产生对应的Job,例如返回的就是一个Job,它可以用来管理协程,一个Job中可以关联多个子Job,同时它也提供了通过外部传入parent的实现这个很好理解,当传入parent时,此时的Job将会作为parent的子Job。

闲暇部落 957

【Simulink教程案例18】基于simulink的基础OFDM+64QAM发射接收链路仿真

OFDM(Orthogonal Frequency Division Multiplexing)即正交频分复用技术,实际上OFDM是MCM(Multi Carrier Modulation),多载波调制的一种。通过频分复用实现高速串行数据的并行传输, 它具有较好的抗多径衰落的能力,能够支持多用户接入。OFDM技术由MCM(Multi-Carrier Modulation,多载波调制)发展而来。OFDM技术是多载波传输方案的实现方式之一,它的。

FPGA/MATLAB学习教程/源码/项目合作开发 1989

android kotlin 协程(三) 理解挂起,恢复以及job

通过上两篇的基础入门,相信大家对协程api已经有了一个基本的影响,本篇开始尝试理解挂起于恢复.本篇不涉及源码, 通过很多应用案例,来理解挂起于恢复!

高级开发者进阶ing... QaQ 1712

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【kotlin 协程】万字协程 一篇完成kotlin 协程进阶

在 Android 平台上,协程主要用来解决两个问题:从本质上来说,协程就是一个轻量级的线程。在使用协程之前,我们需要先引入Coroutine 的包 创建协程的方式有很多种,这里不延伸协程的高级用法(热数据通道Channel、冷数据流Flow.…),创建协程这里介绍常用的三种方式: runBlocking 启动一个协程会阻塞调用它的线程,只到里面的代码执行结束,返回值是泛型T。 launch启动一个协程不会阻塞调用线程,必须要在协程作用域(CoroutineScope)中才能调用,返回值是一个Job asy

半身风雪 5677

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

可能是最全的Kotlin协程讲解

使用协程已经有较长的时间了,但一直停留在launch、async启动协程,suspend方法挂起的阶段。这段时间系统梳理Kotlin知识时才发现,对协程(仅对Kotlin)还有很多概念不甚了解。例如CoroutineScope对协程生命周期的重要性、协程父子结构的作用、结构化并发、一些Kotlin协程中约定俗称的规定等。 概述 解释协程 解释协程这一概念,是个作死的行为,这里斗胆一试。 我们尝试从几个比较流行的说法来解释协程到底是个什么东西,而不是再增加一种让人猜不透的说法 协程是轻量级线程(官方表述)

zou8944的博客 4万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

深潜Kotlin协程(八):Job 和等待子协程

系列电子书:传送门在结构化并发一章中,我们提到父子关系会有以下影响:事实上,子协程从父协程继承上下文是协程构建器行为的基本组成部分。 而结构化并发的其它三个重要的影响完全依赖 上下文。此外, 还可以用来取消协程、追踪协程的状态等等。它是非常重要且有用的,所以本章和接下来的两章将专门讨论 上下文以及与之相关的基本协程机制。从概念上讲,一个 表示具有生命周期的、可以取消的东西。从形态上将, 是一个接口,但是它有具体的合约和状态,所以它可以被当做一个抽象类来看待。A job lifecycle is rep

RikkaTheWorld 2458

Kotlin 协程的生命周期

使用 launch 和 async 开启一个协程后,同时也会返回一个Job对象,Job对象就是协程的句柄。通过 Job 监测协程的生命周期状态,如 isActive、isCancelled、isCompleted。通过 Job 操控协程,如 start()、cancel()。

xiangxiongfly 2409

【Kotlin】协程

相较于 C# 中的协程(详见 →),Kotlin 中协程更灵活,难度更大。协程是一种并发设计模式,用于简化异步编程,它允许以顺序化的方式表达异步操作,避免回调地狱等问题。使用协程,可以将异步操作的代码像同步代码一样写,而无需显式地管理线程。在 Kotlin 中,协程由 kotlinx.coroutines 库提供支持。它使用 suspend 修饰符来标记挂起函数(即可暂停执行并稍后恢复执行的函数),这使得编写异步代码更加直观和简单。协程和线程具有以下异同点。

little_fat_sheep 2392

一文搞懂kotlin协程

挂起函数,相比coroutineScope和supervisorScope多了协程上下文参数,一般传入协程调度器切换协程所在的线程。当前协程的扩展方法,在当前协程下启动一个新的协程,返回的是Job对象,出现异常立刻传播,适用于不需要返回值的场景。的声明中,除了协程上下文参数,还有一个CoroutineStart,代表协程的启动模式。协程的异常遵循结构化并发,子协程的异常会传播到父协程和兄弟协程,立即调度,但是不能立刻取消,需要执行到第一个挂起点才行。当前协程的扩展方法,在当前协程下启动一个新的协程,返回。

dermondlove的博客 2187

Kotlin协程

使用协程已经有较长的时间了,但一直停留在launch、async启动协程,suspend方法挂起的阶段。这段时间系统梳理Kotlin知识时才发现,对协程(仅对Kotlin)还有很多概念不甚了解。例如CoroutineScope对协程生命周期的重要性、协程父子结构的作用、结构化并发、一些Kotlin协程中约定俗称的规定等。 一、什么是协程 我们尝试从几个比较流行的说法来解释协程到底是个什么东西,而不是再增加一种让人猜不透的说法 协程是轻量级线程(官方表述) 可以换个说法,协程就是方法调用封装成类线程的AP

.天天向上. 9795

kotlin协程生命周期-基础

协程生命周期

且听真言 1419

Kotlin 协程(一)协程的定义及基础使用

Kotlin 协程是一种轻量级的并发编程方式,用于简化异步代码的编写。它允许你编写看似同步的代码来处理异步任务,使代码更加简洁、可读且易于维护。协程广泛应用于 Android 开发中,用于网络请求、数据库操作等需要异步执行的任务。协程是一种语法糖 协程的出现是来解决异步问题的,但它本身却不提供异步的能力,协程某种意义上更像是一种语法糖,它为我们隐藏了异步调用和回调的细节,让我们更关注于业务逻辑的实现。一句话概括,协程是一种轻量级的方便操作异步代码的语法糖,而它本身不提供异步能力。

Android 领域开发程序员,希望通过写博客的方式不断的总结提升自己,大家共同进步哦! 1536

kotlin 协程 job的cancel与cancelAndJoin区别

cancel():取消协程,不等待协程执行完成。调用后,协程会被标记为取消,挂起点处会抛出 CancellationException,但调用线程不会等待协程的结束。cancelAndJoin():取消协程,并且等待协程完全终止。调用此方法后,当前线程会阻塞,直到协程完成。通常,当你需要在取消协程之后确保它完全结束后再执行后续操作时,应该使用 cancelAndJoin()。如果你只需要取消协程,不需要关心它是否完全结束,可以使用 cancel()。

u010273224的博客 1859

kotlin语法进阶 - 协程(一)协程基础

kotlin协程基础

weixin_43864176的博客 4162
上一篇: Kotlin 协程基础入门:协程的三种启动方式和挂起函数
下一篇: Kotlin 协程基础入门:协程的上下文 Context (万物皆为Context)
_蓝橙
博客等级 码龄7年 1179粉丝 174原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值