Kotlin协程

不用休眠的 Kotlin 并发:深入对比 delay() 和 sleep() 毫无疑问,Kotlin 语言中的协程 Coroutine 极大地帮助了开发者更加容易地处理异步编程。该特性中封装的诸多高效 API,可以确保开发者花费更小的精力去完成并发任务。一般来说,开发者了解一下如何使用这些 API 就足够了!可就 JVM 的角度而言,协程一定程度上减少了*“回调地狱”*的问题,切实地改进了异步处理的编码方式。相信包括笔者在内的很多开发者常常会好奇。所以,本文将以delay()为切入点,带开发者剖析下协程的背后原理。 阅读详情

首先协程是轻量级的线程
协程创建方式
1.GlobalScope.launch

GlobalScope.launch(Dispatchers.Main) {
    println("")
}

这函数创建了一个协程的作用域,Lambda表达式就在协程中运行了,这个函数创建的是一个顶层协程,这种协程当程序运行结束也结束,你会发现执行后日志不会打印,因为还没有来得及执行代码块中的代码执行,程序就结束了。
2.delay

GlobalScope.launch{
    println("")
    delay(1000)
}

这个时候加一个延时就行了,delay函数是一个非阻塞的挂起函数,delay函数会挂起当前协程,当不会影响其他协程
这里相信大家一定想到了Thread,sleep()函数,但Thread,sleep()函数会阻塞当前线程,这样线程下的所有协程也会被阻塞。
3.runBlocking

runBlocking {
    println("")
    delay(1000)
}

此函数也创建了一个协程的作用域,但它可以保证协程中所有代码执行完之前一直阻塞当前线程,但只建议测试使用。
4.launch

runBlocking {
    launch{
    println("")
    delay(1000)
    }
    launch{
    println("")
    delay(1000)
    }
}

此函数只能在协程的作用域中使用,然后再当前协程的作用域下创建子协程,如果外层协程结束,那此作用域下的所有协程都会结束。
5.suspend

suspend fun printDelay() {
    println("")
    delay(1000)
}

用于将部分代码封装到一个方法中,声明为挂起函数,挂起函数间可以相互调用,但是无法提供协程作用域。
6.coroutineScope

suspend fun printDelay()=coroutineScope {
    launch{
    println("")
    delay(1000)
    }
}

首先coroutineScope也是一个挂起函数,而且会继承外部的协程作用域并创建一个子协程,这样我们就解决了上面的问题,而且它和runBlocking一样可以保证协程中所有代码执行完。
7.取消协程

val job=GlobalScope.launch{
    println("")
    delay(1000)
}
job.cancel()

其实launch函数返回了一个Job对象,调用cancel函数可取消协程。
8.获取返回结果

runBlocking {
    println("")
    val result=async{
    6*2
    }.await()
    delay(1000)
}

async函数可以创建一个子协程并返回一个Deferred对象,如果想获取aa=sync函数代码块中的执行结果,就调用Deferred对象的await函数,当调用await函数时,如果代码没有执行完,就会阻塞当前协程。
9.并行获取返回结果

runBlocking {
    println("")
    val result=async{
    6*2
    }
    val result1=async{
    6+8
    }
    Log.i("","result is ${result.await()+result1.await()}")
    delay(1000)
}

在最后调用2个async函数的await函数,就变成了并发执行关系。
10.withContext

runBlocking {
    val result=withContext(Dispatchers.Default){
    6*2
    }
    delay(1000)
}

类似async函数,会马上执行代码块的代码,同时挂起外部协程。当代码块代码执行完后,会返回最后一行代码作为返回值。
与async函数不同的是,withContext要求强制输入一个线程参数。
这个参数有三个可以选择
(1)Dispatchers.Default
表示默认低并发的线程策略,适合计算密集型的任务
(2)Dispatchers.IO
表示较高并发线程策略,适合执行的代码大多数时间都在阻塞和等待中,比如网络请求
(3)Dispatchers.Main
表示不会开启子线程,而在主线程中执行代码,只能在Android代码中可以使用
11.线程参数
其实除了coroutineScope函数之外,其他函数都可以指定一个线程参数,只是withContext要求强制输入一个线程参数。

探索 Kotlin 协程原理 接下来跟大家分享一下我在了解 Kotlin 协程实现的过程中理解的一些概念,如果你发现哪些地方我说错了的话,欢迎提出你的理解。 1. Kotlin 协程原理概述 Kotlin 协程的大致的执行流程如上图所示,这个流程是各种类型的协程执行时都大致遵循的流程,不是一个严格精确的执行流程。 下面先来看下协程执行过程中的一些关键类的介绍。 1. 协程代码块 当我们调用 launch() 或 withContext() 等协程构建器函数时,对应的协程代码块会被 Kotlin 编译器转换为一个匿名内部类,这个匿名内部 阅读详情

相关推荐

Kotlin协程详解——协程基础

你通常会看到 runBlocking 在应用程序的最顶层被这样使用,而在真正的代码中却很少见到它的身影,因为线程是宝贵的资源,阻塞它们是低效的,而且通常是不被期望的。协程遵循结构化并发的原则,这意味着新的协程只能在特定的 CoroutineScope 内启动,该作用域限定了协程的生命周期。这些情况导致的问题是代码间的嵌套层级太深,导致逻辑嵌套复杂,后续的维护成本也要提高,这不是我们所要看到的。协程可以被视为轻量级的线程,但它们之间存在一些重要的区别,这使得它们在实际使用中与线程有很大的不同。

闲暇部落 2017

kotlin协程代码分析launch

android kotlin 协程 launch源码分析

dxyadc的博客 1273

手把手教你设计MTBF加速寿命试验:从阿伦尼斯模型到卡方计算(含Excel模板)

本文详细介绍了如何设计MTBF加速寿命试验,从阿伦尼斯模型到卡方计算,帮助工程师在合理时间内获得准确的MTBF数据。通过工业电源模块的实例演示,涵盖活化能确定、温度应力设计、样本量计算及数据记录规范,并提供Excel模板实现自动化计算,显著提升测试效率。

weixin_42563415的博客 540

Kotlin的协程,延时、超时(7秒后超时,并中断执行的任务)

Kotlin协程 简介: 优点:写法很简单,轻量级,挂起几乎不消耗内存,速度上优于java的线程,性能损耗小,能大幅度提高并发性能,本人推荐使用协程,而不用传统的线程 代码 引入 implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:0.18" 创建一个协程 launch(CommonPool) { //这里需要运行的代...

wy313622821的博客 2万+

AJ-Report开源数据大屏存在远程命令执行漏洞

该平台可以通过post方式在validationRules参数对应值中进行命令执行,可以获得服务器权限,登陆管理后台接管大屏。如果被攻击者利用,危害后果十分严重。

swordheart的博客 387

手把手教你用HarmBench数据集测试大模型安全性(含多模态案例)

本文详细介绍了如何使用HarmBench数据集测试大模型的安全性,包括文本和多模态越狱指令的实战案例。通过环境配置、数据集获取、测试流程及结果分析,帮助开发者全面评估和提升大模型的安全防护能力,特别关注多模态攻击的防御策略。

weixin_26642481的博客 324

【kotlin 协程】万字协程 一篇完成kotlin 协程进阶

在 Android 平台上,协程主要用来解决两个问题:从本质上来说,协程就是一个轻量级的线程。在使用协程之前,我们需要先引入Coroutine 的包 创建协程的方式有很多种,这里不延伸协程的高级用法(热数据通道Channel、冷数据流Flow.…),创建协程这里介绍常用的三种方式: runBlocking 启动一个协程会阻塞调用它的线程,只到里面的代码执行结束,返回值是泛型T。 launch启动一个协程不会阻塞调用线程,必须要在协程作用域(CoroutineScope)中才能调用,返回值是一个Job asy

半身风雪 5676

Java 简易版 UDP 多人聊天室

【代码】Java 简易版 UDP 多人聊天室。

nmy15570188135的博客 1187

可能是最全的Kotlin协程讲解

使用协程已经有较长的时间了,但一直停留在launch、async启动协程,suspend方法挂起的阶段。这段时间系统梳理Kotlin知识时才发现,对协程(仅对Kotlin)还有很多概念不甚了解。例如CoroutineScope对协程生命周期的重要性、协程父子结构的作用、结构化并发、一些Kotlin协程中约定俗称的规定等。 概述 解释协程 解释协程这一概念,是个作死的行为,这里斗胆一试。 我们尝试从几个比较流行的说法来解释协程到底是个什么东西,而不是再增加一种让人猜不透的说法 协程是轻量级线程(官方表述)

zou8944的博客 4万+

【华为2021校招】笔试题【通用硬件】

时间:2020/07/15 19:00 时长:60min 题型:40单选+5多选 难度:中等 考察范围:模电、数电、SI、EMC、电源、微机原理、计算机网络、材料

Jkcia的博客 4万+

单片机应用案例:ESP32 搭配 BH1750 光强传感器和 Web 服务器

在该应用案例中,我们将使用 ESP32 开发板作为主控制器,BH1750 光强传感器用于采集环境光强度数据,并通过 Web 服务器展示采集到的数据。步骤一:购买材料步骤二:连接硬件步骤三:编写代码我们将使用 Arduino IDE 编写代码,以下是主要代码:// WiFi 设置const char* ssid = “你的 WiFi 名称”;const char* password = “密码”;// Web 服务器实例// BH1750 实例// 获取当前光强度数据。

RlDart的博客 813

Kotlin 协程 看这一篇就够了

前言 Kotlin协程是什么,如何使用?如何结合Retrofit使用?Kotlin 的优势在哪里?相信看完这一篇你一定有所收获! 协程基本使用 若使用协程,首先我们得引入协程相关的开发包 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7-mpp-dev-11' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.7-mpp-de

黄林晴 1万+

【nnUNetv2进阶】四、nnUNetv2 魔改网络-小试牛刀-加入注意力机制ChannelAttention

本文介绍了在nnunet中加入ChannelAttention的方法,按照本文教的教程,可以快速完成ChannelAttention的加入和自定义模型的跑通。

AI爱好者的博客,分享计算机领域相关知识 5801

【Kotlin】协程

相较于 C# 中的协程(详见 →),Kotlin 中协程更灵活,难度更大。协程是一种并发设计模式,用于简化异步编程,它允许以顺序化的方式表达异步操作,避免回调地狱等问题。使用协程,可以将异步操作的代码像同步代码一样写,而无需显式地管理线程。在 Kotlin 中,协程由 kotlinx.coroutines 库提供支持。它使用 suspend 修饰符来标记挂起函数(即可暂停执行并稍后恢复执行的函数),这使得编写异步代码更加直观和简单。协程和线程具有以下异同点。

little_fat_sheep 2386

【FPGA教程案例87】加解密1——基于FPGA的AES加解密算法verilog实现

DES已走到了它生命的尽头。56比特密钥实在太小,虽然三重DES可以解决密钥长度的问题,但是DES的设计主要针对硬件实现,而今在许多领域,需要用软件方法来实现它,在这种情况下,它的效率相对较低。1997年4月15日美国国家标准和技术研究所(NIST)发起征集AES(Advanced Encryption Standard)算法的活动,并成立了AES工作组。目的是为了确定一个非保密的、公开披露的、全球免费使用的加密算法,用于保护下一世纪政府的敏感信息。这里,我们对AES的基本原理进行介绍:

FPGA/MATLAB学习教程/源码/项目合作开发 2546

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Kotlin协程的使用

目录 引入kotlin协程 kotlin协程的三种启动方式 初识协程: 第一种启动方式(runBlocking:T) 第二种启动方式(launch:Job) 第三种启动方式(async/await:Deferred) 实现你的第一个Coroutine程序 浅析Kotlin协程 ——协程是什么?https://blog.youkuaiyun.com/qq_17798399/article/det...

青冘的技术学习博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

一文看透 Kotlin 协程本质

前言 公司开启新项目了,想着准备亮一手 Kotlin 协程应用到项目中去,之前有对 Kotlin 协程的知识进行一定量的学习,以为自己理解协程了,结果……实在拿不出手! 为了更好的加深记忆和理解,更全面系统深入地学习 Kotlin 协程的知识,协程将分为三部分来讲解,本文是第一篇: Kotlin 协程实战进阶(基础篇) Kotlin 协程实战进阶(进阶篇) Kotlin 协程实战进阶(高级篇) 本文大纲 一、概述 协程的概念在1958年就开始出现(比线程还早), 目前很多语言开始原生支, Java

https://juejin.cn/user/1654096907477549/posts 7729

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

kotlin协程入门

可以简单地将它理解成一种轻量级的线程。我们之前所学习的线程是非常重量级的,它需要依靠操作系统的调度才能实现不同线程之间的切换。而使用协程却可以仅在编程语言的层面就能实现不同协程之间的切换,从而大大提升了并发编程的运行效率。为什么使用协程?简洁性:协程使得异步代码看起来像同步代码,减少了回调地狱的问题。轻量级:协程比线程更轻量,可以在同一线程中运行多个协程。易于管理:协程可以通过结构化并发来管理生命周期,避免内存泄漏和资源浪费。

weixin_63357306的博客 1304

Kotlin协程:协程的基础与使用

协程是Coroutine的中文简称,co表示协同、协作,routine表示程序。协程可以理解为多个互相协作的程序。协程是轻量级的线程,它的轻量体现在启动和切换,协程的启动不需要申请额外的堆栈空间;协程的切换发生在用户态,而非内核态,避免了复杂的系统调用。...

LeeDuoZuiShuai的博客 1万+

Kotlin 之协程

协程的基本使用及浅析

禽兽先生不禽兽 1627

Kotlin协程机制

协程是一种轻量级线程,它可以挂起(暂停)和恢复,从而使异步代码看起来像同步代码,极大地提升代码的可读性和结构清晰度。📌 类比:传统的线程是“重型卡车”,协程是“轻便摩托车”——更轻、更灵活。优势说明✅ 语法简洁让异步代码看起来像同步✅ 非阻塞不阻塞线程,提高性能✅ 生命周期安全可与 Android 生命周期绑定✅ 性能优越比线程更轻量、资源占用少✅ 原生支持不依赖第三方库,语言级支持xie che。

王景程的博客 1710
上一篇: RecycleView实现首页复杂布局效果(横向和竖向)
下一篇: BaseQuickAdapter和RecycleView基础使用
橘子先生z
博客等级 码龄7年 11粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘子先生z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值