Kotlin常见技术分享-02-相对于Java 的核心优势-协程

协程

协程 的定位 是kotlin 为了简化 异步编程 而设计的。

在学习相关关键字之前咱们先 了解一些 协程 相关的 重要概念。

首先 第一点需要记住的就是 在 没有协程之前, 在Java中 我们通过 充分的利用 线程 级别的资源, 来充分的 利用底层资源, 比如CPU资源, CPU 多核的情况, 通过线程间的切换 来提高CPU资源的利用率, 然后通过 线程池 来管理 线程, 通过锁机制来确保 安全。 但是 假如 在一个线程 可能遇到了 IO操作的 时候, 在 这个IO操作 执行完 的这段时间, 实际上 这个线程 资源是被浪费的,

而 协程 的定位 就是为了 把这一段 等待的时间, 利用起来 ,

在 Java 中 一个请求 进来, 一般会分配一个线程 处理这个请求 。 即 主线程

然后去执行任务 A,B,C 如果B是一个阻塞性的任务 比如IO操作, 线程就会阻塞。

在Kotlin 中 咱们就可以创建一个协程 来执行 任务 A, B, C

当然执行的时候 协程 还是需要 绑定一个线程 来帮助他执行实际的任务, 但是假如 到了 B阻塞了。
协程 会自动的 把 这个线程释放出来 给别人去用 (我们一般专业一点管这个叫做挂起 英文 suspend) 这样就能把这部分资源 利用起来了。

所以 记住 协程 实际上就是搭建在 线程基础上的 更轻量的 任务调度和编排框架。

挂起函数

挂起函数是一切的基石, 只有用suspend 修饰的函数 且 这个函数里头 真正调用了其他挂起函数比如 delay 函数 , 挂起 的动作才会 生效。

如果你是后端开发者或好奇后端用法:可以知道,在后端典型用法是:每个HTTP请求都包裹在一个协程里处理。当这个协程执行到suspend函数(如查询数据库)时,它会挂起并释放底层线程,这个线程立刻可以去处理其他到达的请求。这样,用几十个线程就能轻松处理成千上万的并发连接。

协程作用域 (CoroutineScope)

呐, 还有一个重要的 东西叫做协程作用域。

首先, 我们知道 线程有线程池来管理, 那么 协程 肯定也需要一个管家, 一种管理机制。

而 协程作用域 就是那个管家, 在创建 协程 之前, 必须先有一个管家。

在管家创建之后, 我们创建出协程, 就可以给他绑定这个管家, 由这个协程 衍生出的 所有子协程 都会受这个 管家 管理, 当 管家 说 停止执行的时候 , 所有由这个管家 管理的 协程 就都得停止。

这种 一个 CoroutineScope 管理一个协程树(或协程组), 通过这种树形结构,才能实现"取消父协程/作用域,所有子协程自动取消"的关键特性 。 这也是后面 另一个概念 结构化并发的 实现基础

相关推荐
宸津-代码粉碎机3 小时前
OpenAI 连夜迎战 Grok Bot 和 Muse:AI 智能体从 “会聊天” 到 “能办事”,现在入场还来得及吗
java·大数据·人工智能·分布式·python
chenbingjie_c4 小时前
C++ 进阶核心知识点总结:模板、内存分区、new/delete、内存池
开发语言·c++
噢,我明白了5 小时前
java中唯一键和幂等键的应用
java·后端
程序猿乐锅5 小时前
【黑马点评 | 第八篇】Redisson分布式锁
java·数据库·spring boot·redis·分布式·spring·缓存
考虑考虑5 小时前
synchronized字符串常量
java·后端·java ee
长谷深风1115 小时前
Tool与Skill:AI能力设计的分水岭
java·人工智能·ai·大模型·aiagent
m0_587383005 小时前
广州24小时自助健身房解决方案实战指南与系统部署要点
java·spring·小程序·架构·需求分析
Escalating_xu5 小时前
【C 语言】深入理解指针(1·下):指针运算、野指针、assert 与传址实战
java·c语言·开发语言
实心儿儿5 小时前
Qt — Qt 事件
开发语言·qt
周杰偷奶茶6 小时前
【Java】数据类型与变量
java·开发语言