当前位置: 首页 > 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;并提供多个使用例子帮助开发者…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...