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

相关推荐
ProgramHan7 小时前
Spring Boot 3.2 新特性:虚拟线程的落地实践
java·jvm·spring boot
IT=>小脑虎7 小时前
C++零基础衔接进阶知识点【详解版】
开发语言·c++·学习
nbsaas-boot7 小时前
Go vs Java 的三阶段切换路线图
java·开发语言·golang
码农小韩7 小时前
基于Linux的C++学习——指针
linux·开发语言·c++·学习·算法
微露清风7 小时前
系统性学习C++-第十九讲-unordered_map 和 unordered_set 的使用
开发语言·c++·学习
BBBBBAAAAAi7 小时前
Claude Code安装记录
开发语言·前端·javascript
毕设源码-钟学长7 小时前
【开题答辩全过程】以 基于Java的慕课点评网站为例,包含答辩的问题和答案
java·开发语言
小北方城市网8 小时前
分布式锁实战指南:从选型到落地,避开 90% 的坑
java·数据库·redis·分布式·python·缓存
maozexijr8 小时前
Rabbit MQ中@Exchange(durable = “true“) 和 @Queue(durable = “true“) 有什么区别
开发语言·后端·ruby