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

【Kotlin】协程

Kotlin协程

  • 背景
  • 定义
  • 实践
    • GlobalScope.launch
    • runBlocking
    • 业务实践

背景

在项目实践过程中,笔者发现很多异步或者耗时的操作,都使用了Kotlin中的协程,所以特地研究了一番。

定义

关于协程(Coroutine),其实更多的应该是一种并发设计模式。与传统的线程或进程相比,协程更加轻量级,因为它运行在线程之上,在执行过程中可以主动地暂停,并在需要时恢复执行。而且这些切换操作是在操作系统中的用户态完成的。

实践

  • 引入maven依赖:
<dependency><groupId>org.jetbrains.kotlinx</groupId><artifactId>kotlinx-coroutines-core</artifactId>
</dependency>
  • 两种启动模式
    • runBlocking
    • GlobalScope.launch

GlobalScope.launch

GlobalScope.launch 中启动的协程不会阻塞主线程。主线程会继续执行,而协程会在后台执行。在上述例子中,为了演示效果,使用了 Thread.sleep(2000) 来模拟等待协程执行。
其中,launch 是一个函数,用于创建协程并将其函数主体的执行分派给相应的调度程序。

fun main() {// 启动协程GlobalScope.launch {delay(2000) // 挂起协程,模拟异步操作println("World!")}println("Hello,")Thread.sleep(4000) // 阻塞主线程,等待协程执行完毕
}

runBlocking

runBlocking 中启动的协程会阻塞当前线程,直到所有启动的协程都执行完毕。

fun main() = runBlocking {// 在 runBlocking 作用域内启动协程launch {// 协程代码println("Inside coroutine")}// 主线程继续执行println("Outside coroutine")// 阻塞主线程,等待协程执行完毕
}

业务实践

  • Dispatchers.IO Kotlin提供的协程调度方式,指示此协程应在为 I/O 操作预留的线程上执行,适合在主线程之外执行磁盘或网络 I/O。
  • Dispatchers.Main 使用此调度程序可在主线程上运行协程。(在官方文档介绍中,主要用于安卓开发中,与界面交互和执行快速工作。)
  • Dispatchers.Default 适合在主线程之外执行占用大量 CPU 资源的工作。
private fun sendRefundHttpPost(weChatPayRefundUrl: String, xmlRequestData: String): Map<String, String> = runBlocking {// 启用协程发送退款操作return@runBlocking withContext(Dispatchers.IO) {val responseXmlStr = careWeChatHttps.postXmlForString(weChatPayRefundUrl, xmlRequestData)WXPayUtil.xmlToMap(responseXmlStr)}}
 private fun getSchoolDate(allTeacherIds: Set<String>): WildSchoolData = runBlocking {// 涉及统计的allTeacherIds 数量比较大, 创建异步任务去操作val elements = allTeacherIds.chunked(60).map {async(Dispatchers.Default) {val totalCount = teacherPerformanceServiceApi.getTeachersTotalPerformanceCount(it).performanceCountval currentWeekCount = teacherPerformanceServiceApi.getTeachersCurrentWeekPerformanceCountByByRangeTime(it).performanceCountWildSchoolData(totalCount, currentWeekCount)}}// 调用await等待异步任务结束return@runBlocking WildSchoolData(elements.awaitAll().sumBy { it.totalCount }, elements.awaitAll().sumBy { it.currentWeekCount })}
fun savePoint(pagePointVo: PagePointVo): Any {// 启用协程执行一个操作流水的插入, 不影响其他操作GlobalScope.launch(context = Dispatchers.IO) {val pagePoint = PagePoint().apply {this.schoolId = pagePointVo.schoolIdthis.userId = pagePointVo.userIdthis.userRole = pagePointVo.userRolethis.moduleKey = pagePointVo.moduleKeythis.eventId = pagePointVo.eventIdthis.clickTime = Date()}pagePointMapper.insert(pagePoint)}// 其他操作}

相关文章:

【Kotlin】协程

Kotlin协程 背景定义实践GlobalScope.launchrunBlocking业务实践 背景 在项目实践过程中&#xff0c;笔者发现很多异步或者耗时的操作&#xff0c;都使用了Kotlin中的协程&#xff0c;所以特地研究了一番。 定义 关于协程&#xff08;Coroutine&#xff09;&#xff0c;其实…...

Scikit-Learn线性回归(五)

Scikit-Learn线性回归五:岭回归与Lasso回归 1、误差与模型复杂度2、范数与正则化2.1、范数2.2、正则化3、Scikit-Learn Ridge回归(岭回归)4、Scikit-Learn Lasso回归1、误差与模型复杂度 在第二篇文章 Scikit-Learn线性回归(二) 中,我们已经给出了过拟合与模型泛化的概念并…...

React(2): 使用 html2canvas 生成图片

使用 html2canvas 生成图片 需求 将所需的内容生成图片div 中包括 svg 等 前置准备 "react": "^18.2.0","react-dom": "^18.2.0","html2canvas": "^1.4.1",实现 <div ref{payRef}></div>const pa…...

CAN物理层协议介绍

目录 ​编辑 1. CAN协议简介 2. CAN物理层 3. 通讯节点 4. 差分信号 5. CAN协议中的差分信号 1. CAN协议简介 CAN是控制器局域网络(Controller Area Network)的简称,它是由研发和生产汽车电子产品著称的德国BOSCH公司开发的,并最终成为国际标准(ISO11519) &#xff0…...

华为OD机试真题-计算面积-2023年OD统一考试(C卷)

题目描述: 绘图机器的绘图笔初始位置在原点(0, 0),机器启动后其绘图笔按下面规则绘制直线: 1)尝试沿着横向坐标轴正向绘制直线,直到给定的终点值E。 2)期间可通过指令在纵坐标轴方向进行偏移,并同时绘制直线,偏移后按规则1 绘制直线;指令的格式为X offsetY,表示在横…...

设计模式之策略模式【行为型模式】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某…...

git使用(完整流程)

1. 新建仓库 1.右击 git bash 后 输入 git init (仓库为:当前目录) git init name (仓库为:name文件夹) git clone https://github.com/Winnie996/calculate.git //https2.工作区域 工作目录 3. 添加 提交 git add . //工作区添加至暂存区 git commit -m "注释内容&q…...

九、HTML头部<head>

一、HTML头部<head> 1、<title>- 定义了HTML文档的标题 使用 <title> 标签定义HTML文档的标题 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>我的 HTML 的第一页</title> </head><b…...

机器学习期末复习

机器学习 选择题名词解释&#xff1a;简答题计算题一、线性回归二、决策树三、贝叶斯 选择题 机器学习利用经验 &#xff0c;须对以下&#xff08;&#xff09;进行分析 A 天气 B 数据 C 生活 D 语言 归纳偏好值指机器学习算法在学习的过程中&#xff0c;对以下&#xff08;&a…...

python-日志模块以及实际使用设计

python-日志模块以及实际使用设计 1. 基本组成 日志模块四个组成部分&#xff1a; 日志对象&#xff1a;产生日志信息日志处理器&#xff1a;将日志信息输出到指定地方&#xff0c;例如终端、文件。格式器&#xff1a;在日志处理器输出之前&#xff0c;对信息进行各方面的美化…...

googlecode.log4jdbc慢sql日志,格式化sql

前言 无论使用原生JDBC、mybatis还是hibernate&#xff0c;使用log4j等日志框架可以看到生成的SQL&#xff0c;但是占位符和参数总是分开打印的&#xff0c;不便于分析&#xff0c;显示如下的效果: googlecode Log4jdbc 是一个开源 SQL 日志组件&#xff0c;它使用代理模式实…...

Linux程序、进程和计划任务

目录 一.程序和进程 1.程序的概念 2.进程的概念 3.线程的概念 4.单线程与多线程 5.进程的状态 二.查看进程信息相关命令&#xff1a; 1.ps&#xff1a;查看静态进程信息状态 2.top&#xff1a;查看动态进程排名信息 3.pgrep&#xff1a;查看指定进程 4.pstree&#…...

【MySQL】索引基础

文章目录 1. 索引介绍2. 创建索引 create index…on…2.1 explain2.2 创建索引create index … on…2.3 删除索引 drop index … on 表名 3. 查看索引 show indexes in …4. 前缀索引4.1 确定最佳前缀长度&#xff1a;索引的选择性 5. 全文索引5.1 创建全文索引 create fulltex…...

精确管理Python项目依赖:自动生成requirements.txt的智能方法

在Python中&#xff0c;可以使用几种方法来自动生成requirements.txt文件。这个文件通常用于列出项目所需的所有依赖包及其版本&#xff0c;使其他人或系统可以轻松地重现相同的环境。下面是几种常见的方法&#xff1a; 使用pip freeze&#xff1a; 这是最常见的方法。pip free…...

JavaWeb基础(1)- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件监听、正则表达式)

JavaWeb基础&#xff08;1&#xff09;- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件监听、正则表达式) 文章目录 JavaWeb基础&#xff08;1&#xff09;- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件…...

java SSM体育器材租借管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM体育器材租借管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要…...

西电期末1030.函数的最大值

一.题目 二.分析与思路 函数打擂台&#xff0c;注意数据类型和保留精度 三.代码实现 #include<bits/stdc.h>//万能头 double f(double x,double a){return a*x*x-x*x*x; }//f(x) int main() {double a;scanf("%lf",&a);double max-1000001;//打擂台for(…...

在Docker中安装Tomact

目录 前言&#xff1a; 一.安装Tomact 查找指定的tomact版本 下载tomact9.0 查看该镜像是否安装成功 安装成功之后就开始运行镜像了 ps&#xff08;用于列出正在运行的Docker容器&#xff09; ​编辑 测试(虚拟机ip:8080) ​编辑 解决措施 ​编辑 完成以上步骤&…...

【书生大模型00--开源体系介绍】

书生大模型开源体系介绍 0 通用人工智能1 InternLM性能及模型2 从模型到应用 大模型成为目前很热的关键词&#xff0c;最热门的研究方向&#xff0c;热门的应用&#xff1b;ChatGPT的横空出世所引爆&#xff0c;快速被人们上手应用到各领域&#xff1b; 0 通用人工智能 相信使…...

基于GPT-3、ChatGPT、GPT-4等Transformer架构的自然语言处理

文章目录 一、内容简介二、前言2.1 Transformer 模型标志着AI 新时代的开始2.2 Transformer 架构具有革命性和颠覆性2.3 Google BERT 和OpenAI GPT-3 等Transformer 模型将AI 提升到另一个层次2.4 本书将带给你的“芝士”2.5 本书面向的读者 三、本书内容简介3.1 第一章3.2 第二…...

一款开源的MES系统

随着工业4.0的快速发展&#xff0c;制造执行系统&#xff08;MES&#xff09;成为了智能制造的核心。今天&#xff0c;将为大家推荐一款开源的MES系统——iMES工厂管家。 什么是iMES工厂管家 iMES工厂管家是一款专为中小型制造企业打造的开源MES系统。它具备高度的可定制性和灵…...

https配置证书

HTTPS 基本原理 https 介绍 HTTPS&#xff08;全称&#xff1a;HyperText Transfer Protocol over Secure Socket Layer&#xff09;&#xff0c;其实 HTTPS 并不是一个新鲜协议&#xff0c;Google 很早就开始启用了&#xff0c;初衷是为了保证数据安全。 国内外的大型互联网…...

图神经网络|10.4 GCN 变换原理的解读

由9.3-邻接矩阵的变换可知&#xff0c;理解矩阵通过两个度矩阵的逆进行归一化。 微观上看&#xff0c; a i j a_{ij} aij​这个元素将会乘上 1 d e g ( v i ) d e g ( v j ) \frac{1}{\sqrt{deg_(v_i)\sqrt{deg(v_j)}}} deg(​vi​)deg(vj​) ​ ​1​ 其现实意义如下—— 比如…...

计算机组成原理 I/O方式

I/O 方式 I/O方式分类: 程序查询方式。由 CPU通过程序不断查询 /O 设备是否已做好准备&#xff0c;从而控制0 设备与主机交换信息程序中断方式。只在 I/0 设备准备就绪并向 CPU发出中断请求时才予以响应。DMA方式。主存和 I/O 设备之间有一条直接数据通路&#xff0c;当主存和…...

VMWare网络配置

1、通用配置 选择自动&#xff0c;相对与选择指定网卡&#xff0c;能解决网卡更换导致网络不可用的问题。 2、每个虚拟机配置...

opencv期末练习题(3)附带解析

创建黑色画板&#xff0c;并支持两种画图功能 import mathimport cv2 import numpy as np """ 1. 创建一个黑色画板 2. 输入q退出 3. 输入m切换画图模式两种模式&#xff0c;画矩形和画圆形。用户按住鼠标左键到一个位置然后释放就可以画出对应的图像 "&qu…...

51单片机之LED灯

51单片机之LED灯 &#x1f334;前言&#xff1a;&#x1f3ee;点亮LED灯的原理&#x1f498;点亮你的第一个LED灯&#x1f498;点亮你的八个LED灯 &#x1f4cc;让LED灯闪烁的原理&#x1f3bd; LED灯的闪烁&#x1f3d3;错误示范1&#x1f3d3;正确的LED闪烁代码应该是这样&am…...

操作系统内存碎片

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com&#xff0c;github地址为https://github.com/jintongxu。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家访问。 一、前言 内存碎片是指无法被利用的内…...

三菱plc学习入门(二,三菱plc指令,触点比较,计数器,交替,四则运算,转换数据类型)

今天&#xff0c;进行总结对plc的学习&#xff0c;下面是对plc基础的学习&#xff0c;希望对读者有帮助&#xff0c;欢迎点赞&#xff0c;评论&#xff0c;收藏&#xff01;&#xff01;&#xff01; 目录 触点比较 当数据太大了的时候&#xff08;LDD32位&#xff09; CMP比…...

Spring学习之——代理模式

Proxy代理模式 介绍 为其他对象提供一种代理以控制对这个对象的访问。在某些情况下&#xff0c;一个对象不适合或者不能直接引用另一个对象&#xff0c;而代理对象可以在客户端和目标对象之间起到中介的作用 2. 组成 抽象角色&#xff1a;通过接口或抽象类声明真实角色实现的…...

用微信公众平台做分类广告网站/网站推广的渠道有哪些

我正在从多个Web服务器负载很重的情况下运行memcached服务器.在调查一些奇怪的应用程序级行为时,我们发现memcached框中的netstat -s显示了很多“由于意外数据而重置的连接”.在负载下,该值每秒上升几百.这是什么意思,我能做些什么呢&#xff1f;输出示例&#xff1a;Ip:147533…...

网站建设费用报价单/长尾关键词网站

每天记录学习&#xff0c;每天会有好心情。*^_^*今天将为大家分析一个机房上机安排管理系统(设计一个运行在学校局域网环境之下的机房管理系统并予以实现.该系统采用了目前流行的客户机/服务器模式,结合了先进的WinSock通信方法和功能强大的ADO数据库访问技术.实践证明:本系统设…...

wordpress 旧版本/产品推广介绍

[首发&#xff1a;cnblogs 作者&#xff1a;byeyear Email&#xff1a;byeyearhotmail.com] 本文将简单推导卡尔曼滤波器的预测和更新公式。为了简单&#xff0c;使用标量&#xff08;一维向量&#xff09;而不是多维向量&#xff0c;并且假设系统没有输入。 系统状态的理…...

网站开发广告宣传语/上海百度推广电话

在画流程图时我们可以考虑使用模板进行套用使用&#xff0c;当然这是对新手来说开始的时候不熟悉绘制&#xff0c;我们可以考虑这样使用&#xff0c;那模板要在哪里寻找呢&#xff1f;下面是在迅捷画图中分享的流程图模板以及模板简介&#xff0c;希望可以帮助到大家。  财务…...

宁夏一站式网站建设/正规的微信推广平台

在lifelong比赛上下载了图片数据集&#xff0c;目标是将不同光照下不同视角物体的分类&#xff0c;每张图片只含有一种类别&#xff0c;一共有51个类别&#xff08;有刀、订书机、杯子、勺子等&#xff09;&#xff0c;所以想到了用ResNet50做图片分类&#xff0c;顺便学习ResN…...

兼职做效果图的网站有哪些/seo优化顾问服务阿亮

以下文章来源于Excel广场 ,作者话里胡哨 今天和大家说说柱状图在制作中的注意事项。 1.纵坐标从0开始 纵坐标从哪里开始,不知大家有没有观察过?其实这是一个很简单,也是必不可少的一个技巧,那就是从0开始。 为什么这么说呢? 相同的数据,不同的起始点,不一样的感觉。 右…...