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

kotlin协程并发/并行与串行互相切换,CoroutineScope与await

kotlin协程并发/并行与串行互相切换,CoroutineScope与await

 

import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.time.LocalTimefun main(args: Array<String>) {println("${LocalTime.now()} - main start")CoroutineScope(Dispatchers.Default).launch {// 并发执行this.launch {println("${LocalTime.now()} A start")delay(1000)println("${LocalTime.now()} A end")}this.launch {println("${LocalTime.now()} B start")delay(1500)println("${LocalTime.now()} B end")}}println("${LocalTime.now()} - main end")
}

87f9d76084ad4426bafefd397bbdf68a.png

 输出表明main退出后,A,B均没有输出。CoroutineScope(Dispatchers.IO).launch新起的任务不阻塞主main任务执行流程。

如果换成runBlocking(Dispatchers.IO):

import kotlinx.coroutines.*
import java.time.LocalTimefun main(args: Array<String>) {println("${LocalTime.now()} - main start")runBlocking(Dispatchers.IO) {// 并发执行this.launch {println("${LocalTime.now()} A start")delay(1000)println("${LocalTime.now()} A end")}this.launch {println("${LocalTime.now()} B start")delay(1500)println("${LocalTime.now()} B end")}}println("${LocalTime.now()} - main end")
}

1f6b5f0d021045d7893676b304f93a40.png

 

 

看一下async

import kotlinx.coroutines.*
import java.time.LocalTimefun main(args: Array<String>) {println("${LocalTime.now()} - main start")CoroutineScope(Dispatchers.IO).launch() {// 并发执行this.async {println("${LocalTime.now()} A start")delay(1000)println("${LocalTime.now()} A end")}this.async {println("${LocalTime.now()} B start")delay(1500)println("${LocalTime.now()} B end")}}println("${LocalTime.now()} - main end")
}

b2bbb1a5826f4435b74dd643b3b9eabc.png

 如果main线程休息1000ms:

import kotlinx.coroutines.*
import java.time.LocalTimefun main(args: Array<String>) {println("${LocalTime.now()} - main start")CoroutineScope(Dispatchers.IO).launch() {// 并发执行this.async {println("${LocalTime.now()} A start")delay(1000)println("${LocalTime.now()} A end")}this.async {println("${LocalTime.now()} B start")delay(1500)println("${LocalTime.now()} B end")}}Thread.sleep(1000)println("${LocalTime.now()} - main end")
}

bc1857a373b2488da03f53447e70202b.png

 

 

import kotlinx.coroutines.*
import java.time.LocalTimefun main(args: Array<String>) {println("${LocalTime.now()} - main start")runBlocking {CoroutineScope(Dispatchers.IO).launch() {val task1 = this.async {println("${LocalTime.now()} A start")delay(1000)println("${LocalTime.now()} A end")"task1 return"}val task2 = this.async {println("${LocalTime.now()} B start")delay(1500)println("${LocalTime.now()} B end")"task2 return"}val t1 = task1.await()println("${LocalTime.now()} $t1")val t2 = task2.await()println("${LocalTime.now()} $t2")}}println("${LocalTime.now()} - main end")
}

39e1e4a2e3e3478da0ef690db39afe19.png

 

总体上CoroutineScope(Dispatchers.IO).launch()的意义在于新起一个线程,不阻塞主main线程,由于

 

 

 

理解await

import kotlinx.coroutines.*
import java.time.LocalTimefun main(args: Array<String>) {println("${LocalTime.now()} - main start")runBlocking {//launch() {val task1 = this.async {println("${LocalTime.now()} A start")delay(3000)println("${LocalTime.now()} A end")"task1 return"}val task2 = this.async {println("${LocalTime.now()} B start")delay(1000)println("${LocalTime.now()} B end")"task2 return"}val t1 = task1.await()println("${LocalTime.now()} $t1")val t2 = task2.await()println("${LocalTime.now()} $t2")//}}println("${LocalTime.now()} - main end")
}

1ec6b998a72b411fab336c7ce142b909.png

 虽然task2很快就完成,因为await,所以必须等待task1返回。

 

 

 

kotlin协程async与await_zhangphil的博客-CSDN博客runBlocking 内部启动的3个协程做耗时操作,从输出可以看到3个协程交叉并发执行,runBlocking 会等到3个协程执行结束后才退出,输出结果有明确先后顺序。一般编程的技法,比如,在Android中,假设在主线程中实现了一个函数,但该函数是耗时操作,毫无疑问,需要将这个函数的实现切入非主线程中操作,那么可以设计一种托管的函数,在托管的函数里面干脏活,处理完成后,把结果抛到主线程。结果1-a: 5 - tid:22。结果1-b: 5 - tid:24。结果2-a: 9 - tid:22。https://blog.csdn.net/zhangphil/article/details/129268399

https://zhangphil.blog.csdn.net/article/details/129265638https://zhangphil.blog.csdn.net/article/details/129265638

kotlin协程、线程切换,函数方法委托_zhangphil的博客-CSDN博客runBlocking 内部启动的3个协程做耗时操作,从输出可以看到3个协程交叉并发执行,runBlocking 会等到3个协程执行结束后才退出,输出结果有明确先后顺序。一般编程的技法,比如,在Android中,假设在主线程中实现了一个函数,但该函数是耗时操作,毫无疑问,需要将这个函数的实现切入非主线程中操作,那么可以设计一种托管的函数,在托管的函数里面干脏活,处理完成后,把结果抛到主线程。结果1-a: 5 - tid:22。结果1-b: 5 - tid:24。结果2-a: 9 - tid:22。https://blog.csdn.net/zhangphil/article/details/130161705

https://zhangphil.blog.csdn.net/article/details/129250518https://zhangphil.blog.csdn.net/article/details/129250518

 

 

 

相关文章:

kotlin协程并发/并行与串行互相切换,CoroutineScope与await

kotlin协程并发/并行与串行互相切换&#xff0c;CoroutineScope与await import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.time.LocalTimefun main(args: Arra…...

初识linux之简单了解TCP协议与UDP协议

目录 一、理解源IP地址和目的IP地址 二、端口号 1. 为什么要有端口号 2. 理解端口号 3. 源端口号和目的端口号 三、初步了解TCP协议和UDP协议 1. 初步认识TCP协议 2. 初步认识UDP协议 3. 可靠传输与不可靠传输 四、网络字节序 1. 网络字节序的概念 2. 如何形成网络…...

【String——简单使用】

文章目录 String1. 字符串定义和初始化2. 字符串基本操作2.1 访问单个字符2.2 修改字符串内容2.3 字符串查找和比较 3. 常用字符串函数3.1 length() 和 size()3.2 empty()3.3 substr()3.4 c_str() 4.字符与整形之间相互转换4.1 char 类型转 int 类型4.2 int 类型转 char 类型4.…...

Python下Taobao封装API接口的优势

Python是一门面向对象编程的语言&#xff0c;封装是面向对象编程中的一种重要概念&#xff0c;它把数据和方法包装在一起&#xff0c;实现了对数据的保护和控制。Python封装接口的优势如下&#xff1a; 1.安全性 封装可以保证数据的安全性&#xff0c;禁止外部对数据的直接访…...

LeetCode 49 字母异位词分组

LeetCode 49 字母异位词分组 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/group-anagrams/description/ 博主Github&#xff1a;https://github.com/GDUT-Rp/LeetCode 题目&#xff1a; 给你一个字符串数组&#x…...

( 链表) 142. 环形链表 II——【Leetcode每日一题】

❓142. 环形链表 II 难度&#xff1a;中等 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定…...

论文解读 | 基于改进点对特征的点云6D姿态估计

原创 | 文 BFT机器人 01 摘要 点对特征(PPF)方法已被证明是一种有效的杂波和遮挡下的姿态估计方法。 文章的改进方法主要包括: (1)一种基于奇偶规则求解封闭几何的法向的方法; (2)通过将体素网格划分为等效角度单元的有效降采样方法; (3)基于拟合点的验证步骤。在真实杂波数据集…...

Shell脚本while循环语句应用

记录&#xff1a;433 场景&#xff1a;Shell脚本while循环语句应用。Shell脚本while循环语句应用。while do done、while : do done、while true do done。 版本&#xff1a;CentOS Linux release 7.9.2009。 1.while常用格式 1.1格式一&#xff1a;while do done while c…...

Kubernetes Dashboard + Ingress 及其 yaml 文件分析

概述 记录部署Dashboard Ingress的具体过程及其 yaml 文件分析 Dashboard Yaml # Copyright 2017 The Kubernetes Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the Li…...

【SpringCloud组件——Nacos】

前置准备&#xff1a; 分别提供订单系统&#xff08;OrderService&#xff09;和用户系统&#xff08;UserService&#xff09;。订单系统主要负责订单相关信息的处理&#xff0c;用户系统主要负责用户相关信息的处理。 一、服务注册与发现 1.1、在父工程当中引入Nacos依赖 …...

pinia状态管理 用法

Pinia是一个用于vue的状态管理库&#xff0c;类似于vuex,是vue的另一种状态管理工具。 Pinia 是 Vue 的存储库&#xff0c;它允许跨组件/页面共享状态。实际上&#xff0c;Pinia就是Vuex的升级版&#xff0c;官网也说过&#xff0c;为了尊重原作者&#xff0c;所以取名pinia&am…...

Oracle客户端版本安装

一、版本准备 Oracle版本下载官网&#xff1a;Instant Client for Linux x86-64 (64-bit) | Oracle 中国 进入网站下载对应的oracle版本&#xff0c;通常环境所用的包有&#xff1a;basic、sdk、sdkplus三个包。包的类型分为rpm和zip包&#xff0c;均可以下载&#xff0c;当前…...

基于Android studio二手车交易系统app

客户端&#xff1a; 用户注册&#xff1a;通过输入用户名&#xff0c;密码&#xff0c;所在地&#xff0c;联系地址以及电话和电子邮件等信息进行用户信息的注册。 二手车查看&#xff1a;用户注册登录系统后&#xff0c;可以查看二手车的基本信息&#xff0c;通过二手车的品牌…...

【LCD应用编程】绘制点、线、矩形框

之前获取LCD屏幕参数信息时了解到&#xff0c;LCD屏是 FrameBuffer 设备&#xff0c;操作 FrameBuffer 设备 其实就是在读写 /dev/fb0 文件。除此之外&#xff0c;LCD屏上包含多个像素点&#xff0c;绘制点、线、矩形框本质是在修改这些像素点的颜色。 目录 1、定义 lcd_color…...

第八篇、基于Arduino uno,获取MAX30102心率传感器的心率信息——结果导向

0、结果 说明&#xff1a;先来看看串口调试助手显示的结果&#xff0c;第一个值是原始的IR值&#xff0c;第二个值是实时的心跳&#xff0c;第三个值是平均心跳&#xff0c;如果是你想要的&#xff0c;可以接着往下看。 1、外观 说明&#xff1a;MAX30102心率传感器的外观如下…...

【MySQL】MySQL主从同步延迟原因与解决方案

文章目录 一、MySQL数据库主从同步延迟产生的原因二、关于DDL和DML三、主从延时排查方法四、解决方案3.1 解决从库复制延迟的问题&#xff1a;3.2 MySql数据库从库同步其他问题及解决方案 一、MySQL数据库主从同步延迟产生的原因 MySQL的主从复制都是单线程的操作&#xff0c;…...

学C的第二十二天【深度剖析数据在内存中的存储:1. 数据类型介绍;2. 整型在内存中的存储】

相关代码gitee自取&#xff1a;C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a;学C的第二十一天【初阶测评讲解&#xff1a;1. 计算递归了几次&#xff1b;2. 判断 do while 循环执行了几次&#xff1b;3. 求输入的两个数的最小公倍数&#xff1b;4. 将一句话的单词进…...

测试计划模板一

测试计划 修订历史记录 版本        日期       AMD       修订者      说明      1.0 XXXX年XX月XX (A-添加,M-修改,D-删除) 目录 1. 简介.. 4 1. 1目的... 4 1. 2背景... 4...

【利用AI让知识体系化】5种创建型模式

文章目录 创建型模式简介工厂模式抽象工厂模式单例模式建造者模式原型模式 创建型模式 简介 创建型模式&#xff0c;顾名思义&#xff0c;是用来创建对象的模式。在软件开发中&#xff0c;对象的创建往往比一般的编程任务更为复杂&#xff0c;可能涉及到一些琐碎、复杂的过程…...

Unity的UnityStats: 属性详解与实用案例

UnityStats 属性详解 UnityStats 是 Unity 引擎提供的一个用于监测游戏性能的工具&#xff0c;它提供了一系列的属性值&#xff0c;可以帮助开发者解游戏的运行情况&#xff0c;从而进行优化。本文将详细介绍 UnityStats 的每个属性值&#xff0c;并提供多个使用例子帮助开发者…...

GraphQL Ruby解析器模式:10个业务逻辑分离与代码复用的终极技巧

GraphQL Ruby解析器模式&#xff1a;10个业务逻辑分离与代码复用的终极技巧 【免费下载链接】graphql-ruby Ruby implementation of GraphQL 项目地址: https://gitcode.com/gh_mirrors/gr/graphql-ruby GraphQL Ruby解析器模式是现代Ruby GraphQL应用开发的核心模式&a…...

告别键盘连击烦恼:这款开源工具让你的机械键盘重获新生

告别键盘连击烦恼&#xff1a;这款开源工具让你的机械键盘重获新生 【免费下载链接】KeyboardChatterBlocker A handy quick tool for blocking mechanical keyboard chatter. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyboardChatterBlocker 还在为键盘连击问题而…...

yz-bijini-cosplay效果惊艳展示:高精度布料褶皱、金属反光、发丝细节呈现

yz-bijini-cosplay效果惊艳展示&#xff1a;高精度布料褶皱、金属反光、发丝细节呈现 基于通义千问Z-Image底座与yz-bijini-cosplay专属LoRA的RTX 4090专属Cosplay风格文生图系统&#xff0c;为Cosplay创作带来了革命性的突破。这个系统不仅支持LoRA动态无感切换和多训练步数版…...

深入解析DW_apb_i2c与TMP75的寄存器交互:从配置到温度读取

1. 认识TMP75温度传感器与DW_apb_i2c控制器 TMP75是德州仪器&#xff08;TI&#xff09;推出的一款高精度数字温度传感器&#xff0c;采用I2C接口通信&#xff0c;内置12位ADC&#xff0c;分辨率可达0.0625C。我在多个嵌入式项目中都用过它&#xff0c;实测稳定性相当不错。它的…...

HoRain云--Julia运算符全解析

&#x1f3ac; HoRain云小助手&#xff1a;个人主页 &#x1f525; 个人专栏: 《Linux 系列教程》《c语言教程》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;…...

基于STM32微控制器的DHT11环境温湿度监测系统设计与实现

基于stm32的环境温湿度监测系统设计(DHT11)最近在折腾STM32的环境监测小项目&#xff0c;发现DHT11这玩意儿真是便宜又好用。虽然精度比不上那些高端传感器&#xff0c;但做个室内温湿度监控绰绰有余。今天咱们直接开干&#xff0c;手把手搭个能跑的系统。硬件部分简单到哭&…...

AIGC技术实操:AI生图、AI视频开发与工具集成

2026年&#xff0c;AIGC技术已从“玩具级应用”走向“产业级工具”&#xff0c;其中AI生图、AI视频成为开发者的热门布局领域&#xff0c;据统计&#xff0c;AIGC/传媒领域商业化进程最快&#xff0c;MCN行业人工智能渗透率超60%&#xff0c;广告行业渗透率达55%。对于开发者而…...

别再让广播闪退!Android 14广播安全新规RECEIVER_EXPORTED的保姆级避坑指南

Android 14广播安全新规&#xff1a;RECEIVER_EXPORTED的深度解析与实战指南 去年秋天&#xff0c;当Google正式发布Android 14时&#xff0c;许多开发者发现原本运行良好的广播注册代码突然开始抛出SecurityException。这个看似简单的API变更背后&#xff0c;其实是Android团队…...

大模型开发避坑:彻底理清 Skill(技能)与 MCP(模型 上下文协议)的本质区别与协同

在目前的 AI 应用开发圈子里&#xff0c;各种新名词层出不穷&#xff1a;Skill&#xff08;技能&#xff09;、Plugin&#xff08;插件&#xff09;、Function Calling&#xff08;函数调用&#xff09;、Tool&#xff08;工具&#xff09;、MCP&#xff08;模型上下文协议&…...

Midscene.js:重塑UI自动化的革命性AI视觉驱动方案

Midscene.js&#xff1a;重塑UI自动化的革命性AI视觉驱动方案 【免费下载链接】midscene AI-powered, vision-driven UI automation for every platform. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene 你是否曾为编写复杂的UI自动化脚本而头疼&#xff…...