Kotlin Coroutines

news/2025/11/14 21:19:28/文章来源:https://www.cnblogs.com/vonlinee/p/19223443

https://kotlinlang.org/docs/coroutines-overview.html

协程是作为三方库进行提供的,类似 javax

<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><kotlin.code.style>official</kotlin.code.style><kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget><coroutines.version>1.7.3</coroutines.version><kotlin.version>2.2.0</kotlin.version>
</properties><dependencies><dependency><groupId>org.jetbrains.kotlin</groupId><artifactId>kotlin-test-junit5</artifactId><version>2.2.0</version><scope>test</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.10.0</version><scope>test</scope></dependency><!-- Kotlin 标准库 --><dependency><groupId>org.jetbrains.kotlin</groupId><artifactId>kotlin-stdlib</artifactId><version>${kotlin.version}</version></dependency><!-- Kotlin 协程核心 --><dependency><groupId>org.jetbrains.kotlinx</groupId><artifactId>kotlinx-coroutines-core</artifactId><version>${coroutines.version}</version></dependency><!-- Kotlin 协程 JDK8 支持 --><dependency><groupId>org.jetbrains.kotlinx</groupId><artifactId>kotlinx-coroutines-jdk8</artifactId><version>${coroutines.version}</version></dependency><!-- 测试依赖 --><dependency><groupId>org.jetbrains.kotlinx</groupId><artifactId>kotlinx-coroutines-test</artifactId><version>${coroutines.version}</version><scope>test</scope></dependency>
</dependencies>

基本使用

协程的创建和执行流程

  1. 协程创建:通过 launch 或 async 创建协程

  2. 调度器分配:根据指定的调度器决定执行线程

  3. 挂起函数调用:遇到挂起函数时保存当前状态

  4. 线程释放:挂起时释放线程,供其他协程使用

  5. 恢复执行:挂起操作完成后恢复协程执行

launch - 不需要返回结果

import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlockingfun main() = runBlocking {val job: Job = launch {// 协程体delay(1000L)println("World!")}println("Hello,")job.join() // 等待协程完成
}

async - 需要返回结果

import kotlinx.coroutines.Deferred
import kotlinx.coroutines.async
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlockingfun main() = runBlocking {val deferred: Deferred<Int> = async {// 执行计算并返回结果delay(1000L)42}val result = deferred.await() // 等待并获取结果println("Result: $result") // 42
}

runBlocking - 桥接阻塞代码和协程

import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlockingfun main() {runBlocking {// 在这个块内,协程会阻塞当前线程launch {delay(1000L)println("Inside runBlocking")}}println("After runBlocking")
}

协程作用域 CoroutineScope

协程上下文 CoroutineContext

import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlockingfun main() = runBlocking {// 自定义上下文val customContext = Dispatchers.IO + CoroutineName("MyCoroutine") + SupervisorJob()launch(customContext) {println("Running in thread: ${Thread.currentThread().name}")println("Coroutine name: ${coroutineContext[CoroutineName]?.name}")}.join()
}

挂起函数 Suspend Functions

使用 suspend 关键字修饰的函数即为挂起函数

suspend fun myFunc()

调度器 Dispatchers

import kotlinx.coroutines.withContextsuspend fun demonstrateDispatchers() {// Dispatchers.Main - Android主线程withContext(Dispatchers.Main) {// 更新UI}// Dispatchers.IO - 用于磁盘和网络IOwithContext(Dispatchers.IO) {// 文件操作、网络请求}// Dispatchers.Default - 用于CPU密集型任务withContext(Dispatchers.Default) {// 复杂计算、排序、处理大量数据}// Dispatchers.Unconfined - 不限制在任何特定线程withContext(Dispatchers.Unconfined) {// 在调用者线程开始,在恢复时的线程继续}
}

异常处理

通道 (Channel) 和流 (Flow)

Channel - 协程间的通信

import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlockingfun main(): Unit = runBlocking {val channel = Channel<Int>()// 生产者launch {for (x in 1..5) {channel.send(x * x)delay(100L)}channel.close() // 关闭通道}// 消费者launch {for (y in channel) {println("Received: $y")}}
}

Flow - 异步数据流

import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asSharedFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.mapclass FlowExample {fun simpleFlow(): Flow<Int> = flow {// 流构建器for (i in 1..3) {delay(100L)emit(i) // 发射值}}suspend fun collectFlow() {simpleFlow().map { it * it } // 转换.filter { it % 2 != 0 } // 过滤.collect { value -> // 收集println("Collected: $value")}}// 状态流private val _state = MutableStateFlow(0)val state: StateFlow<Int> = _state.asStateFlow()// 共享流private val _events = MutableSharedFlow<Int>()val events: SharedFlow<Int> = _events.asSharedFlow()
}

结构化并发

import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.cancel
import kotlinx.coroutines.delay
import kotlinx.coroutines.launchfun structuredConcurrencyExample() {val scope = CoroutineScope(Job())scope.launch {// 父协程launch {// 子协程1delay(1000L)println("Child 1 completed")}launch {// 子协程2delay(2000L)println("Child 2 completed")}}// 取消父协程会自动取消所有子协程Thread.sleep(500L)scope.cancel() // 所有子协程都会被取消
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/965714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我的标题

我的内容111111

深入解析:软考中级-系统集成项目管理工程师**的超详细知识点笔记。

深入解析:软考中级-系统集成项目管理工程师**的超详细知识点笔记。2025-11-14 21:14 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !…

GeoScene Pro试用申请

GeoScene Pro试用申请 按在线的文档配置 GeoScene Pro申请试用 - 易智瑞教育网 1)要求你输入许可的,如下图,这时候需要更换【许可类型】为“指定用户许可”(4.0版本软件这里写的是“授权用户许可”) 更换许可…

题解:P13573 [CCPC 2024 重庆站] Pico Park

P13573:区间 DP、组合数学VP 的时候没题可跟了,就开了这题切掉了,结果 VP 结束发现正赛就一个队伍过了??? 若 \(x\) 用缩小枪击中了 \(y\),则从 \(x\) 向 \(y\) 连一条有向边。注意到,任何一个时刻得到的图是若…

【AI智能体】Coze 提取对标账号短视频生成视频文案实战详解 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Java Benchmark使用

如何测量Java代码的性能 在 Java 中,可以使用多种方法来测量一段代码的执行性能。使用 System.currentTimeMillis()是最常见的方法 long startTime = System.currentTimeMillis();// 需要测量的代码块 for (int i = 0…

实用指南:12-机器学习与大模型开发数学教程-第1章1-4 导数与几何意义

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

基于Vue社区共享游泳馆预约高效的系统n897q36e (工具+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

docker登录容器镜像仓库

容器镜像仓库就是我们平时自己构建的镜像有一个存储的位置,方便自己平时进行拉取,测试用的我使用的是ucloud这容器仓库ucloud.cn登录容器仓库的操作docker logindocker login uhub.service.ucloud.cn# username 为登…

吴恩达深度学习课程二: 改善深层神经网络 第三周:超参数调整,批量标准化和编程框架(一)超参数调整

此分类用于记录吴恩达深度学习课程的学习笔记。 课程相关信息链接如下:原课程视频链接:[双语字幕]吴恩达深度学习deeplearning.ai github课程资料,含课件与笔记:吴恩达深度学习教学资料 课程配套练习(中英)与答案…

Go-秘籍-全-

Go 秘籍(全)原文:zh.annas-archive.org/md5/d17f8ead62b31a6ec2bbef4005dc3b6d 译者:飞龙 协议:CC BY-NC-SA 4.0第一章:错误处理技巧 1.0 引言 亚历山大蒲柏在他的论批评的散文中写道:“出错是人性的”。由于软…

Kotlin中的flow、stateflow、shareflow之间的区别和各自的功能 - 教程

Kotlin中的flow、stateflow、shareflow之间的区别和各自的功能 - 教程2025-11-14 20:36 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto…

非离散网络流——P3347 [ZJOI2015] 醉熏熏的幻想乡

非离散网络流——P3347 [ZJOI2015] 醉熏熏的幻想乡 观察费用为 \(a_ix^2+b_ix\),如果是离散的,则可以套路的建边 \(a_i+b_i,3a_i+b_i,5a_i+b_i,\dots\),可本题 \(x\in R\)。 于是连续意义下我们应该求导得到 \(2a_i…

[note] 素数判定与分解质因数

在某些毒瘤的数论题中,可能出现对 \(10^{18}\) 的范围内的数质因数分解的情况。这时,可以使用 Fermat 和 Miller-Rabin 算法进行素性判定,Pollard-Rho 算法寻找非平凡因子,两者结合以快速质因数分解。 Fermat 素性…

不能识别adb/usb口记录 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

恭喜自己,挑战成功! - Ghost

恭喜自己,挑战成功! 我终于,拿省一啦! 正文: 在2025年8月18日,本人开始了一项挑战 挑战三个月达省一 在三个月后,2025年11月14日,NOI官网发布了分数and分数线 本人以高出一等分数线10分的分数(250pts),成功…

如何在测试覆盖不足后补充验证

测试覆盖不足是项目质量的重大隐患,一旦发现(尤其是当它已导致线上问题时),团队必须立即采取系统性的补充验证措施。核心策略是停止盲目开发,转而执行一套以风险为导向的补救流程。 首先,必须立即对未覆盖的区域…

react动态表单

来个例子 比如有两种登录方式 // 导入表单验证库 import * as z from zod; // 导入消息提示组件 import { toast } from sonner; import { useState } from react; // 导入 UI 组件 import { Input } from @repo/shadc…

完整教程:PDFBox - PDDocument 与 byte 数组、PDF 加密

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Dark Side of the Moon

“Speak to Me” "Ive been mad for fucking years, absolutely years, been over the edge for years, been working me buns off for bands..." "Ive always been mad, I know Ive been mad, like mo…