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:组合挂起函数

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【UE 插件】UE4 虚幻引擎 插件开发(带源码插件打包、无源码插件打包) 有这一篇文章就够了!!!

目录 0 引言1 快速入门1.1 新建插件的前提1.2 创建插件步骤1.3 打包插件 2 无源代码的插件制作3 插件详细介绍3.1 插件的使用方法3.1 UE 预置插件模版3.1.1 空白3.1.2 纯内容3.1.3 编辑器独立窗口3.1.4 编辑器工具栏按钮3.1.5 编辑器模式3.1.6 第三方库3.1.7 蓝图库 3.2 插件中…

【视频异常检测】Delving into CLIP latent space for Video Anomaly Recognition 论文阅读

Delving into CLIP latent space for Video Anomaly Recognition 论文阅读 ABSTRACT1. Introduction2. Related Works3. Proposed approach3.1. Selector model3.2. Temporal Model3.3. Predictions Aggregation3.4. Training 4. Experiments4.1. Experiment Setup4.2. Evaluat…

Re62:读论文 GPT-2 Language Models are Unsupervised Multitask Learners

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文全名:Language Models are Unsupervised Multitask Learners 论文下载地址:https://cdn.openai.com/better-language-models/language_models_are_unsupervised_multitask_learner…

jar读取目录配置、打包jar后无法获取目录下的配置

jar读取目录配置、打包jar后无法获取目录下的配置 jar读取目录配置、打包jar后无法获取目录下的配置。java打成jar包后获取不到配置文件路径。解决项目打成jar包上线无法读取配置文件。打包jar后无法读取resource下的配置文件 场景 需要读取 src/main/resources/mapper下的所…

计算机网络:TCP篇

计网tcp部分面试总结 tcp报文格式: 序列号:通过SYN传给接收端,当SYN为1,表示请求建立连接,且设置序列号初值,后面没法送一次数据,就累加数据大小,保证包有序。 确认应答号&#x…

算法——贪心算法

《算法图解》——贪心算法 # 首先创建一个表,包含所覆盖的州 states_needed set([mt,wa,or,id,nv,ut,az]) # 传入一个数组,转换成一个集合#可供选择的广播台清单 stations {} stations[kone] set([id,nv,ut]) #用集合表示想要覆盖的州,且不…

【IC设计】Verilog线性序列机点灯案例(四)(小梅哥课程)

文章目录 该系列目录:设计环境设计目标设计思路RTL及Testbench代码RTL代码Testbenchxdc约束 仿真结果 声明:案例和代码来自小梅哥课程,本人仅对知识点做做笔记,如有学习需要请支持官方正版。 该系列目录: Verilog线性…

ChatGPT是什么,怎么使用,需要注意些什么?

一、ChatGPT 是什么? ChatGPT,全称聊天生成预训练转换器(Chat Generative Pre-trained Transformer),是 OpenAI 开发的人工智能(AI)聊天机器人程序,于2022年11月推出。该程序使用基于GPT-3.5、GPT-4架构的…

编写一个sum函数,由用户输入参数n,并计算1到n的整数和--c语言

#include<stdio.h> int sum(int n); int sum(int n) {int result0;do{resultresultn;//先从n开始加}while(n-->0);return result; }int main() {int n,result;printf("请输入参数");scanf("%d",&n);printf("结果是&#xff1a;%d",…

【腾讯云 TDSQL-C Serverless 产品体验】TDSQL-C MySQL Serverless实践之路

【腾讯云 TDSQL-C Serverless 产品体验】TDSQL-C MySQL Serverless实践之路 腾讯云TDSQL-C联合CSDN推出了一款云数据库产品测评活动&#xff0c;让我们一起来体验一下。 一、什么是云数据库&#xff1f; 云数据库是指被优化或部署到一个虚拟计算环境中的数据库&#xff0c;可以…

数码管的动态显示(四)

1.原理 2.代码 2.1 seg_595_dynamic.v module seg_595_dynamic(input wire sys_clk ,input wire sys_rst_n ,input wire[19:0] data ,input wire[5:0] point ,input wire sign ,input wire seg_en ,output wire ds ,output wire oe…

.htaccess全站设置SSL,wordpress全站设置SSL,网站重定向的次数过多”错误最佳解决方法教程

.htaccess全站设置SSL,wordpress全站设置SSL&#xff0c;网站重定向的次数过多”错误最佳解决方法教程 网上找了很多教程网无效**.htacces**设置&#xff0c;访问后台出现重定向次数过多&#xff0c;导致无法访问 找了好久&#xff0c;测试用AI机器人无法解决&#xff0c;参考…

基于PyTorch的视频分类实战

1、数据集下载 官方链接&#xff1a;https://serre-lab.clps.brown.edu/resource/hmdb-a-large-human-motion-database/#Downloads 百度网盘连接&#xff1a; https://pan.baidu.com/s/1sSn--u_oLvTDjH-BgOAv_Q?pwdxsri 提取码: xsri 官方链接有详细的数据集介绍&#xf…

ASP .Net Core 8.0 依赖注入的三种注入模式

&#x1f433;前言 &#x1f340;在.NET中&#xff0c;依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;是一种设计模式&#xff0c;用于解耦组件之间的依赖关系。 依赖注入的核心思想是将对象的依赖关系&#xff08;即对象所需的其他服务或组件&#…

【系统架构设计师】软件架构设计 02

系统架构设计师 - 系列文章目录 01 系统工程与信息系统基础 02 软件架构设计 文章目录 系统架构设计师 - 系列文章目录 文章目录 前言 一、软件架构的概念 ★★★ 二、基于架构的软件开发 ★★★★ 三、软件架构风格 ★★★★ 1.数据流风格 2.调用/返回风格 3.独立构件风格…

鸿蒙Harmony应用开发—ArkTS声明式开发(绘制组件:Polygon)

多边形绘制组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Polygon(value?: {width?: string | number, height?: string | number}) 从API version 9开始&#xff0…

面试经典150题【81-90】

文章目录 面试经典150题【81-90】530.二叉搜索树的最小绝对差值230.二叉搜索树中第k小的元素98.验证二叉搜索树92.反转链表II25.K个一组翻转链表146.LRU缓存909. 蛇梯棋&#xff08;未做&#xff09;433.最小基因变化127.单词接龙&#xff08;未做&#xff09;17.电话号码的字母…

C++Qt学习——QFile、QPainter、QChart

目录 1、QFile&#xff08;文本读写&#xff09;——概念 1.1、拖入三个控件&#xff0c;对pushButton进行水平布局&#xff0c;之后整体做垂直布局 1.2、按住控件&#xff0c;转到槽&#xff0c;写函数 1.3、打开文件控件 A、首先引入以下两个头文件 B、设置点击打开文件控…

c语言,联合体

一.什么是联合体&#xff1a; 像结构体一样&#xff0c;联合体也是由一个或多个成员变量组成的这些成员变量可以是不同的类型&#xff0c;但编译器只给最大成员分配足够的内存&#xff0c;联合体体内的成员都是公用一块空间的&#xff0c;因此联合体也叫做共同体 二.联合体类…

MySql安装与卸载—我耀学IT

1.MySql安装 打开下载的mysql安装文件mysql-5.5.27-win32.zip&#xff0c;双击解压缩&#xff0c;运行“setup.exe”。 选择安装类型&#xff0c;有“Typical&#xff08;默认&#xff09;”、“Complete&#xff08;完全&#xff09;”、“Custom&#xff08;用户自定义&…