当前位置: 首页 > article >正文

协程学习笔记1

一、CPU密集型任务Test fun test Cpu Task()runBlocking{ val startTime System.currentTimeMillis() val joblaunch(Dispatchers.Default){ var nextTimestartTime var i0 while (i5){ if(System.currentTimeMillis()nextTime){ println(job:Im sleeping ${i}) nextTime500 } } } delay(1000) println(Im going to cancel) job.cancelAndJoin() }执行结果job:Im sleeping 0 job:Im sleeping 1 job:Im sleeping 2 Im going to cancel job:Im sleeping 3 job:Im sleeping 4任务没有被正常取消处理方式有三种while (i5 isActive)添加isActivewhile (i5){ ensureActive() if(System.currentTimeMillis()nextTime){ println(job:Im sleeping ${i}) nextTime500 } }添加ensureActive()while (i5){ yield() if(System.currentTimeMillis()nextTime){ println(job:Im sleeping ${i}) nextTime500 } }添加yield()二、协程取消资源释放Test fun test cancel and release()runBlocking { val joblaunch{ try { repeat(1000){i- println(task:${i}) delay(200) } }finally { println(job:Im going to release) } } delay(500) println(Im going to cancel) job.cancelAndJoin() }在finally中进行资源的释放当协程的取消过程中有挂起函数要执行时挂起函数无法执行挂起函数之后的代码也不会执行Test fun test cancel and release()runBlocking { val joblaunch{ try { repeat(1000){i- println(task:${i}) delay(200) } }finally { println(job:Im going to release) delay(1000) println(Release completed) } } delay(500) println(Im going to cancel) job.cancelAndJoin() }执行结果task:0 task:1 task:2 Im going to cancel job:Im going to releasedelay挂起函数和后序的println没有执行Test fun test cancel and release()runBlocking { val joblaunch{ try { repeat(1000){i- println(task:${i}) delay(200) } }finally { withContext(NonCancellable){ println(job:Im going to release) delay(1000) println(Release completed) } } } delay(500) println(Im going to cancel) job.cancelAndJoin() }用withContext(NonCancellable)可以解决这个问题task:0 task:1 task:2 Im going to cancel job:Im going to release Release completed三、协程中的异常处理异常传播协程构建器有两种形式自动传播异常launch与actor向用户暴露异常async与produce当这些构建器用于创建一个根协程时前者的异常会在发生的第一时间被抛出而后者依赖用户来最终消费异常例如通过await或receive。非根协程中产生的协程会被传播。当一个协程由于一个异常而运行失败时它会传播这这个异常并传递给它的父级。接下来父级会进行下面几个操作1、取消它自己的子级2、取消它自己3、将异常传播并传递给它的父级SupervisorJob使用SupervisorJob时一个子协程的运行失败不会影响到其他子协程。SupervisorJob不会传播异常给它的父级它会让子协程自己处理异常。//使用SupervisorJob() Test fun text SupervisorJob()runBlocking{ val supervisorJob CoroutineScope(SupervisorJob() Dispatchers.Default) val job1supervisorJob.launch { delay(100) println(child 1) throw IllegalArgumentException() } val job2supervisorJob.launch { delay(1000) println(child 2) } delay(5000) }运行结果child 1和child 2都被打印出来。若将SupervisorJob()改为Job()则只会输出child 1。也可以使用supersScope来达到相同效果。异常的捕获使用CoroutinExceptionHandler对协程的异常进行捕获。以下条件被满足时异常就会被捕获时机异常是被自动抛出异常的协程所抛出的使用launch而不是async位置在CoroutineScope的CoroutineContext中CoroutineScope(Dispatchers.IO handler)在根协程上GlobalScope.launch(handler) CoroutineScope().launch(handler)在supervisorScope的直接子协程中不能给supervisorScope本身设置supervisorScope { launch(handler) { //代码块 } }全局异常处理全局异常处理器可以获取到所有协程(非协程中的不会被捕获)未处理的未捕获的异常不过它并不能对异常进行捕获虽然不能阻止程序崩溃全局异常处理器在程序调试和异常上报等场景中仍然有非常大的用处。我们需要在classpath下面创建META-INF/services目录并在其中创建一个名为kotlinx.coroutines.CoroutineExceptionHandler的文件文件内容就是我们的全局异常处理器的全类名。红色方框里面的复制到kotlinx.coroutines.CoroutineExceptionHandler这个文件中异常的处理如果一个协程遇到了CancellationException以外的异常它将使用该异常取消它的父协程。当父协程取消所有子协程后异常才会被父协程处理。fun test child cancel()runBlocking { val handler CoroutineExceptionHandler{_,exception- println(Caught $exception)//A父协程处理异常 } val job GlobalScope.launch(handler){ launch { try { delay(2000) }finally { withContext(NonCancellable){//B正常的子协程被取消 println(Another coroutine is cancelled) delay(3000) println(finished noncancellable block) } } } launch{ delay(100) println(second child throws an exception) throw IndexOutOfBoundsException()//C异常的子协程出现异常 } } job.join() }运行结果执行顺序为C-B-A(子协程出现异常-取消所有子协程-父协程处理异常)second child throws an exception Another coroutine is cancelled finished noncancellable block Caught java.lang.IndexOutOfBoundsException异常的聚合当协程的多个子协程因为异常而失败时一般情况下取第一个异常进行处理。在第一个异常之后发生的所有其他异常都将被绑定到第一个异常之上。Test fun test compain exception()runBlocking { val handler CoroutineExceptionHandler{_,exception- println(First exception : $exception) println(Later exception : ${exception.suppressedExceptions.toString()}) } val job GlobalScope.launch(handler){ launch{ delay(100) throw IndexOutOfBoundsException() //第一个异常 } launch { try { delay(1000) }finally { withContext(NonCancellable){ throw IllegalArgumentException() //第二个异常 } } } launch { try { delay(2000) }finally { withContext(NonCancellable){ throw IOException() //第三个异常 } } } } job.join() }运行结果First exception : java.lang.IndexOutOfBoundsException Later exception : [java.io.IOException, java.lang.IllegalArgumentException]

相关文章:

协程学习笔记1

一、CPU密集型任务Test fun test Cpu Task()runBlocking{val startTime System.currentTimeMillis()val joblaunch(Dispatchers.Default){var nextTimestartTimevar i0while (i<5){if(System.currentTimeMillis()>nextTime){println("job:Im sleeping ${i}")ne…...

团队协作效率遭遇瓶颈?这 1 个开放式网盘生态,救活了 10 万+ 企业的文档流(含竞品实测)

在 2026 年的企业级 SaaS 市场&#xff0c;很多团队管理者陷入了一个怪圈&#xff1a;买了一堆功能大而全的“全家桶”网盘&#xff0c;结果员工依然习惯用微信传文件&#xff0c;文档躺在云端变成死数据。 为什么&#xff1f;因为真正的“生态”不是强迫用户在网盘里用简陋的…...

结构建模与数字孪生破解偏远桥梁监测难题

STAAD与iTwin提供结构建模与数字孪生解决方案&#xff0c;助力实现智能、经济高效的桥梁维护策略优化桥梁检测与维护I-15州际公路纵贯美国南加州与加拿大阿尔伯塔省&#xff0c;全长1400英里&#xff0c;仅有29英里穿过亚利桑那州最西端的莫哈维县&#xff0c;其中有15英里的路…...

Android jetpack LiveData (二) 原理篇

Android jetpack LiveData&#xff08;二&#xff09;原理篇引言源码前置分析核心类源码第一步&#xff0c;定义LiveData对象第二步&#xff0c;观察LiveData数据第三步&#xff1a; 设置LiveData数据到这里我们先总结下黏性数据的步骤&#xff1a;小结引言 上一篇我们学习了L…...

【PCIe 验证每日学习・Day13】DLLP 与 ACK/NAK 重传机制基础验证

大家好&#xff0c;继续我们「PCIe 验证每日学习・30 分钟打卡」系列。今天进入数据链路层核心&#xff1a;DLLP 帧结构、ACK/NAK 应答机制与重传验证。内容严格遵循 PCIe 规范、100% 无错误&#xff0c;讲解通俗、结构清晰、代码可直接复用&#xff0c;风格与前几日完全统一&a…...

Linux 的 cat 命令

Linux 的 cat 命令详解 命令概述 cat&#xff08;concatenate 的缩写&#xff09;是 Linux 系统中最基础且常用的命令之一&#xff0c;主要用于查看文件内容、合并文件以及创建简单文件。该命令属于 GNU coreutils 包的一部分&#xff0c;几乎在所有 Linux 发行版中都默认安装…...

burpsuite详细安装教程及功能讲解

好久不见&#xff0c;各位道友 目录 好久不见&#xff0c;各位道友 Brp Suite 介绍 正常情况下&#xff08;不使用Burp Suite&#xff09;&#xff0c;客户端与服务器的交互过程如下&#xff1a; 当加入Burp Suite时&#xff0c;客户端与服务器的交互过程如下&#xff1a;…...

春日桌搭新首选!ROG魔霸9 Mini:3L 迷你机身,塞下锐龙 9+RTX5070

三月春意渐浓&#xff0c;很多人都开始给自己的桌面焕新升级&#xff0c;而一款体积小巧、性能够强的主机&#xff0c;绝对是桌搭升级的核心。最近 ROG 推出的魔霸 9 Mini 电竞迷你主机&#xff0c;就精准命中了玩家与办公人群的核心需求 —— 仅 3L 的超小体积&#xff0c;却塞…...

Qt导航栏组件A03:VS Code 风格的图标侧栏

目录 一、引言 二、最终效果预览 三、核心实现原理 3.1 布局结构设计 3.2 核心技术点 四、代码实现详解 4.1 项目结构 4.2 导航组件的核心代码 4.3 样式表设计 五、总结 5.1 核心要点回顾 5.2 学习建议 源码下载 系列编号:A-03 导航风格:只有图标的侧栏 适用场景:IDE、编辑器…...

计算机毕业设计源码:Python贝壳租房数据可视化与智能推荐系统 Scrapy爬虫 可视化 推荐系统 大数据 数据分析 大模型 房源 房子(建议收藏)✅

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ > &#x1f345;想要获取完整文章或者源码&#xff0c;或者代做&#xff0c;拉到文章底部即可与…...

深度探索Fluent中的电弧、激光与熔滴一体化模拟

Fluent电弧&#xff0c;激光&#xff0c;熔滴一体模拟。 UDF包括高斯旋转体热源、双椭球热源&#xff08;未使用&#xff09;、VOF梯度计算、反冲压力、磁场力、表面张力&#xff0c;以及熔滴过渡所需的熔滴速度场、熔滴温度场和熔滴VOF。初识激光熔化沉积&#xff1a;一场材料…...

电-气-热综合能源系统节点能价计算方法研究

基本文献复现-计及碳排放成本的电_气_热综合能源系统节点能价计算方法研究 真正做到了电热气潮流耦合&#xff0c;很适合综合能源系统建模的初学者&#xff0c;配合复现论文。 运行程序HeatGasPowerCombination即可。 每个系统模型都有专门的文档讲解&#xff0c;程序注释齐全。…...

香草纪元开服教程:使用云鸢联机平台快速搭建“食旅纪行”服务器(高配推荐版)

你是否喜欢原版风格&#xff0c;热爱收集&#xff0c;渴望在minecraft中休闲养老&#xff1f;你是否喜欢眼前一亮的各种新奇模组&#xff0c;热爱探索&#xff0c;打造神器征战各种boss&#xff1f;你是否在找一个农夫乐事大型养老包&#xff0c;想在mc里做个美食家&#xff1f…...

增程式电动汽车自适应ECMS能量管理策略:基于工况的Matlab实现方案

增程式电动汽车基于工况的自适应ECMS能量管理策略&#xff08;matlab的m程序&#xff09; 最近试驾某品牌增程式电动车时&#xff0c;发现一个有趣现象&#xff1a;堵车时增程器几乎不启动&#xff0c;而上了高速却像开了狂暴模式。这背后的能量管理策略有点东西&#xff0c;今…...

Comsol锂枝晶模型:锂枝晶生长与锂离子浓度、电势分布的模拟

comsol锂枝晶模型 Comsol 锂枝晶生长模型&#xff0c;锂枝晶生长&#xff0c;锂离子浓度分布&#xff0c;电势分布 此链接是随机形核生长锂电池实验室里最让人头疼的玩意就是锂枝晶。这货像金属胡须一样野蛮生长&#xff0c;动不动就刺穿隔膜搞短路。去年用COMSOL建锂枝晶模型时…...

基于改进蛇优化算法(GOSO/ISO)优化极限梯度提升树的时间序列预测

基于改进蛇优化算法(GOSO/ISO)优化极限梯度提升树的时间序列预测(GOSO/ISO-XGBoost) 蛇优化算法SO是2022年提出的新算法&#xff0c;性能优异&#xff0c;目前应用较少&#xff0c;改进蛇优化算法GOSO/ISO应用更少&#xff0c;适合PAPER 改进点1为在初始化种群引入混沌映射&…...

大厂ZigBee射频芯片CC2430反向电路探索

大厂ZigBee射频芯片CC2430反向电路 学习方法是&#xff1a;可以直接查看里面的电路结构&#xff0c;还有管子的宽长比参数等。 拿到原理图之后需要自己换成自己所持有的PDK就可以跑仿真了&#xff0c;国内大部分公司都是这样设计芯片产品的&#xff0c;参考价值非常大&#xff…...

Matlab实现频率切片小波变换(FSWT)绘制时频图

Matlab进行频率切片小波变换(FSWT)源代码&#xff0c;将一维信号生成时频图。 输入信号可以是任何一维信号&#xff0c;心电信号、脑电信号、地震波形、电流电压数据等。 相比连续小波变换(CWT)&#xff0c;频率切片小波变换(Frequency Slice Wavelet Transform,FSWT)是一种更具…...

Prompt工程深度揭秘

&#x1f3af; Prompt工程深度揭秘&#xff1a;AI的"说明书"是如何进化的 从简单指令到复杂工程&#xff1a;理解Prompt如何让AI变得"听话" 你是不是好奇&#xff0c;这些这么多的新东西&#xff0c;他们在使用的时候不都是一堆提示词嘛&#xff0c;那分裂…...

飞轮储能系统建模详解与MATLAB仿真实践(含永磁同步电机驱动模型)含多种模型与建模仿真指南

飞轮储能系统的建模与MATLAB仿真 飞轮储能系统的建模与MATLAB仿真&#xff08;永磁同步电机作为飞轮驱动电机&#xff09;含详细建模文件 内含两个飞轮储能模型&#xff1a;模型一的机侧网侧分开运行&#xff0c;附54页建模仿真说明&#xff1b;模型二的机侧网侧同步运行——内…...

基于全阶磁链观测器的异步电机矢量控制

基于全阶磁链观测器的异步电机矢量控制全阶磁链观测器的主要思想是将异步电机模型作为参考&#xff0c;把状态估计的方程作为可调节部分。 这两部分具有相同物理意义的输出量&#xff0c;利用两个部分的输出量误差再经过反馈校正通道对状态观测值进行修正&#xff0c;使观测值快…...

高级特性之dubbo超时机制及集群容错机制

当服务消费者要进行消费的时候&#xff0c;这个时候它可能就开启一个线程去调用服务提供者的具体实现&#xff0c;等他返回相应的结果&#xff0c;这个时候由于网络的问题或者服务端并不可靠&#xff0c;它会在这阻塞很长的一段时间。如果这个服务一直有人在调用那么就会开一堆…...

西门子S7-1200 PLC工业污水处理系统:基于博途V13sp1的WinCC画面组态与仿真报告

西门子工业污水处理系统&#xff0c;plc污水处理系统&#xff0c;基于plc的污水处理系统&#xff0c;系统采用s7-1200PLC设计&#xff0c;博途wincc画面组态。 包括plc触摸屏组态画面及仿真&#xff0c;报告等 博途V13sp1编程&#xff0c;V13sp1以上版本可以打开工业污水处理系…...

事件触发控制代码及其对应参考文献

事件触发控制代码对应参考文献 1.2023IEEE TRANS 顶刊基于事件触发的深度强化学习自动驾驶决策&#xff08;CCF-A&#xff09; 2.多智能体分布式系统的事件触发控制 3.基于观测器的非理想线性多智能体事件触发的跟踪一致性 4.非线性不确定扰动多智能体系统固定时间事件触发一致…...

实测对比后!千笔AI,开源免费降重首选

在AI技术迅速发展的今天&#xff0c;越来越多的学生和研究人员开始依赖AI工具辅助论文写作。然而&#xff0c;随着知网、维普、万方等查重系统不断升级算法&#xff0c;以及Turnitin对AIGC&#xff08;人工智能生成内容&#xff09;的识别愈发严格&#xff0c;AI率超标问题已成…...

直驱风机Simulink仿真模型与永磁直驱式风力发电系统整体仿真:380V与690V双电压仿真...

直驱风机simulink仿真模型&#xff0c;永磁直驱式风力发电系统 matlab/simulink整体仿真&#xff0c;有380V和690V两个仿真&#xff0c;波形如图&#xff0c;现货有2018 和 2021 两个版本&#xff0c;可导出2015b-2022版本&#xff0c;有模型说明和文献直驱风机在风电场的应用这…...

Canoe-Autosar网络管理自动化测试脚本及Capl源码:全套、可直接使用修改项目配置

Canoe-Autosar网络管理自动化测试脚本 Capl源码&#xff0c;全套&#xff0c;修改项目配置可以直接使用。 1.启动程序 2.加载配置文件 3.选择帧类型(标准帧或扩展帧) 4.修改配置文件&#xff0c;自动弹出配置文件窗口 5.选择测试用例 6.点击运行 7.测试完成打印报告并记录对应…...

基于LADRC自抗扰控制的VSG三相逆变器预同步并网策略

基于LADRC自抗扰控制的VSG三相逆变器预同步并网控制策略 基于LADRC自抗扰控制的VSG三相逆变器预同步并网控制策略是一种用于实现逆变器在微电网中的协调运行的先进控制策略。 逆变器控制方式采用虚拟同步发电机控制&#xff08;VSG&#xff09;&#xff0c;通过引入虚拟同步发电…...

桥梁裂缝图像识别 智慧桥梁钢筋裸漏图像识别 基建领域混凝土结构病害检测 桥梁病害图像 YOLO格式数据集 第10515期

混凝土病害检测数据集 README类别 锈蚀钢筋 蟹爪状破损 碳化 受侵蚀混凝土 开裂混凝土 劣质混凝土 剥落 泛碱 微裂缝 裂缝往期热门主题 主页搜两字"关键词"直达 代码数据获取&#xff1a; 获取方式&#xff1a;***文章底部卡片扫码获取***覆盖了YOLO相关项目、OpenCV…...

基于FPGA的视频缩放算法:支持4K2K输入与输出,缩放参数可控

基于fpga的视频缩放算法&#xff0c;支持4k2k输入&#xff0c;4k2k输出&#xff0c;缩放参数可控。最近在折腾一个FPGA视频处理项目&#xff0c;发现市面上的缩放方案要么延迟太高&#xff0c;要么资源占用爆炸。自己动手撸了个支持4K60帧的缩放架构&#xff0c;参数还能实时调…...