Kotlin: 协程的四种启动模式(CoroutineStart)

点击查看CoroutineStart英文文档

创建协程的三种方式

  1. runBlocking
    运行一个协程并且会阻塞当前线程,直到它完成。
  2. launch
    启动一个新的协程,不会阻塞当前线程,并且返回一个Job,可以取消。
  3. async
    async和await是两个函数,这两个函数在我们使用过程中一般都是成对出现的。
    async用于启动一个异步的协程任务,await用于去得到协程任务结束时返回的结果,结果是通过一个Deferred对象返回的。

    在概念上,async 就类似于 launch。它启动了一个单独的协程,这是一个轻量级的线程并与其它所有的协程一起并发的工作。不同之处在于 launch 返回一个 Job 并且不附带任何结果值,而 async 返回一个 Deferred —— 一个轻量级的非阻塞 future, 这代表了一个将会在稍后提供结果的 promise。可以使用 .await() 在一个延期的值上得到它的最终结果, 但是 Deferred 也是一个 Job,所以如果需要的话,你可以取消它。

CoroutineStart源码

在这里插入图片描述

协程的四种启动模式一:DEFAULT

Default——根据上下文立即调度协程执行。
如果协程上下文的[CoroutineDispatcher]从[CoroutineDispatcher. isdispatchneeded]返回’ true ’
函数,然后协程代码被调度以供稍后执行,而代码被调度
被调用的协程构建器继续执行。

注意[Dispatchers。unconstrained总是从它的[CoroutineDispatcher.isDispatchNeeded]返回false
函数,所以用[Dispatchers. *]启动协程。unconstrained [DEFAULT]与使用[un分派]相同。

如果协程[Job]在它有机会开始执行之前被取消,那么它将不会启动它的执行,但将以异常完成。

在挂起点的协同程序的可取消性取决于的具体实现细节暂停功能。使用[suspenpendcancellablecoroutine]实现可取消的挂起函数。

示例

fun main() = runBlocking {val job = launch (start = CoroutineStart.DEFAULT){println("开始执行耗时操作...")delay(2000L)println("耗时操作结束")}delay(1000L)job.cancel()println("任务取消了")
}

运行结果
在这里插入图片描述

协程的四种启动模式二:LAZY

仅在需要时才惰性地启动协程。

详细信息请参见相应协程构建器的文档
(如[launch][CoroutineScope])。launch]和[async][coroutincope .async])。

如果协程[Job]在它有机会开始执行之前被取消,那么它将不会启动它的执行,但将以异常完成。


fun main() = runBlocking {val job = async  (start = CoroutineStart.LAZY){println("开始执行耗时操作...")delay(2000L)println("耗时操作结束")}delay(1000L)job.cancel()println("任务取消了")job.await()
}

运行结果
在这里插入图片描述

协程的四种启动模式三:ATOMIC

自动地(即,以一种不可取消的方式)根据上下文调度协程的执行。
这类似于[DEFAULT],但是协程在开始执行之前不能被取消。

在挂起点的协程是否可取消,取决于挂起函数如[DEFAULT]。

@ExperimentalCoroutinesApi //从1.0.0开始,没有稳定性的ETA


fun main() = runBlocking {val job = async(start = CoroutineStart.ATOMIC) {println("开始执行耗时操作...")//在挂起点之前不会被取消delay(2000L)//这里就是一个挂起点, delay是挂起函数println("耗时操作结束")}delay(1000L)job.cancel()println("任务取消了")
}

运行结果
在这里插入图片描述

协程的四种启动模式四:UNDISPATCHED

立即执行协程,直到它在当前线程中的第一个挂起点
协程是使用[dispatchers . unconstrained]启动的。但是,当协程从暂停状态恢复时
根据上下文中的[CoroutineDispatcher]进行分派。

这类似于[ATOMIC],因为协程即使已经被取消也会开始执行。
但不同之处在于它在同一个线程中开始执行。

在挂起点的协程是否可取消,取决于挂起函数如[DEFAULT]。

注:这是一个实验性api。当使用此模式时,协程的执行语义可能会在将来发生变化。
@ExperimentalCoroutinesApi //从1.0.0开始,没有稳定性的ETA

fun main() = runBlocking {val job = async(context = Dispatchers.IO, start = CoroutineStart.UNDISPATCHED) {println("开始执行耗时操作... ${Thread.currentThread().name}")//在挂起点之前不会被取消delay(2000L)//这里就是一个挂起点, delay是挂起函数println("耗时操作结束...${Thread.currentThread().name}")}delay(1000L)job.cancel()println("任务取消了...${Thread.currentThread().name}")
}

运行结果
在这里插入图片描述

从上图可以看到, async(context = Dispatchers.IO, start = CoroutineStart.UNDISPATCHED) ,但是还在主线程执行的。

推荐

Kotlin:组合挂起函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/755565.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

词令微信小程序怎么添加到我的小程序?

微信小程序怎么添加到我的小程序? 1、找到并打开要添加的小程序; 2、打开小程序后,点击右上角的「…」 3、点击后底部弹窗更多选项,请找到并点击「添加到我的小程序」; 4、添加成功后,就可以在首页下拉我的…

Elasticsearch:使用 OpenAI、LangChain 和 Streamlit 的基于 LLM 的 PDF 摘要器和 Q/A 应用程序

嘿! 您是否曾经感觉自己被淹没在信息的海洋中? 有这么多的书要读,而时间却这么少,很容易就会超负荷,对吧? 但猜猜怎么了? 你可以使用大型语言模型创建自定义聊天机器人,该模型可以帮…

CTF题型 Http请求走私总结Burp靶场例题

CTF题型 Http请求走私总结&靶场例题 文章目录 CTF题型 Http请求走私总结&靶场例题HTTP请求走私HTTP请求走私漏洞原理分析为什么用前端服务器漏洞原理界定标准界定长度 重要!!!实验环境前提POST数据包结构必要结构快速判断Http请求走私类型时间延迟CL-TETE-CL 练习例题C…

开发遇到的bug:设置好的请求头不起作用

前言:有个接口的请求头是content-type: "application/json",我已经在拦截器里设置添加了该请求头,但实际请求却一直是content-type:application/x-www-form-urlencoded 问题:封装请求函数的文件有两个,相当于…

【XR806开发板试用】WSL环境搭建问题及解决措施

本文主要记录在WSL环境下搭建XR806开发环境的过程中遇到的一些问题,如果后续大家有遇到类似问题可以参考;有部分地方的解决方法不一定是最好的,有些步骤也不一定是必要的,经过多次尝试和资料查询才最终解决,因此没有特…

深入解析分布式ID生成机制

一、概述 背景:随着数据库数据量的增长, 基于性能原因需要进行分库分表,分库分表会导致主键ID重复问题。 特点: 全局唯一性[必须];趋势递增[非必须]。由于互联网大部分采用Mysql的Innodb引擎,因此保持有序主键ID有利于insert的效率;单调递增…

KKVIEW远程: TODESK退出了还能远程吗

Todesk退出了还能远程吗 当我们谈论Todesk或其他远程桌面软件时,一个经常被提及的问题是:当我退出Todesk后,是否仍然可以远程访问我的计算机?为了回答这个问题,我们首先需要了解Todesk的工作原理和远程访问的基本条件…

【视觉语言大模型+LLaVA1.0】大语言模型视觉助手(视觉指令调优)GPT4-Vision丐版

官方资源汇总: 项目主页 || https://huggingface.co/liuhaotian 23.04.LLaVA1.论文: Large Language and Vision Assistant(Visual Instruction Tuning) 23.10 LLaVA-1.5论文: Improved Baselines with Visual Instruction Tuning 23.11 LLaVA-Plus项目&…

java基于zxing生成二维码的工具类

java生成指定内容二维码工具类及其用法&#xff1a; 首先导入zxing相关pom依赖 <!--二维码生成识别组件--><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.3</version></dep…

李畑受邀出席第20届“韩国品牌大奖”颁奖典礼

2024年3月14日&#xff0c;第20届“韩国品牌大奖”颁奖典礼在韩国国家新闻中心举行。李畑女士受邀出席&#xff0c;和与会嘉宾一同见证这一年度盛事。 “韩国品牌大奖”是由政府主管的品牌奖项&#xff0c;旨在奖励在品牌经营方面作出突出贡献的企业和机构。该奖项依据公信力&a…

1.python安装

1.检查是否已经安装python 打开cmd 输入 python --version查看是否有返回版本,没有返回则环境变量未设置好,或者未安装 2.下载安转python https://www.python.org/downloads/windows/ 勾选配置环境变量路径 安装成功

外贸网站常用的wordpress模板

零件配件WordPress外贸建站模板 汽车行业零配件WordPress外贸建站模板&#xff0c;卖配件、零件的外贸公司可以使用的WordPress主题。 https://www.jianzhanpress.com/?p4912 WordPress外贸独立站主题 简洁实用的WordPress外贸独立站主题&#xff0c;适合时尚服装行业搭建w…

Java使用itextpdf往pdf中插入图片

引入maven依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.9</version> </dependency>java代码 import cn.hutool.extra.qrcode.QrCodeUtil; import com.itextpdf.text.*; i…

UE5中各类型的英文名称缩写(直接用于文件前缀)

真正开发项目时用到的素材文件是相当巨量的&#xff0c;在资产中查找时由于不区分文件夹&#xff0c;因此查找是比较头疼的&#xff0c;所以很多同类型的文件名命名时要加入缩写。 本文提供初学者内容包中的缩写&#xff0c;并会在此后陆续加入自定义的缩写&#xff08;本部分…

抖音视频批量提取软件|无水印视频下载

抖音视频批量提取软件&#xff0c;让您高效下载精彩内容&#xff01; 您是否经常需要下载抖音视频&#xff0c;但传统的下载方式繁琐且低效&#xff1f;别担心&#xff0c;我们为您提供了一款强大而智能的抖音视频批量提取软件&#xff0c;让您轻松实现下载无水印的精彩内容&am…

Java Web项目—餐饮管理系统Day11-Linux-基本知识点(二)

文章目录 1. 打包压缩命令2. 文本编辑命令命令模式插入模式底行模式 4-5. 查找命令findgrep 5. 软件包安装安装 Java安装 tomcat防火墙操作停止Tomcat服务 安装 MySQL 服务登录MySQL数据库&#xff0c;查阅临时密码 1. 打包压缩命令 打包压缩命令 tar 作用:对文件进行打包、解…

【好书推荐2】AI提示工程实战:从零开始利用提示工程学习应用大语言模型

【好书推荐2】AI提示工程实战&#xff1a;从零开始利用提示工程学习应用大语言模型 写在最前面AI辅助研发方向一&#xff1a;AI辅助研发的技术进展方向二&#xff1a;行业应用案例方向三&#xff1a;面临的挑战与机遇方向四&#xff1a;未来趋势预测方向五&#xff1a;与法规的…

深入理解模板进阶:掌握C++模板的高级技巧

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f648;个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&…

Reactor线程模型

线程模型 一、背景1.socket网络通信2.IO模型与线程模型3.线程模型分类3.1 阻塞模型3.2 Reactor模型3.3 Proactor模式 二、阻塞模型1.代码示例 三、Reactor模型1.单Reactor单线程1.1 处理过程1.2 优缺点1.3 代码示例 2.单Reactor多线程2.1 处理机制2.2 优缺点 3.主从Reactor3.1 …

缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级的理解

一&#xff1a;缓存雪崩 我们可以简单的理解为&#xff1a;由于原有缓存失效&#xff0c;新缓存未到期间 (例如&#xff1a;我们设置缓存时采用了相同的过期时间&#xff0c;在同一时刻出现大面积的缓存过期)&#xff0c;所有原本应该访问缓存的请求都去查询数据库了&#xff…