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

相关推荐
不会编程的懒洋洋7 小时前
C# P/Invoke 基础
开发语言·c++·笔记·安全·机器学习·c#·p/invoke
直奔標竿7 小时前
Java开发者AI转型第二十五课!Spring AI 个人知识库实战(四)——RAG来源追溯落地,拒绝AI幻觉
java·开发语言·人工智能·spring boot·后端·spring
时空系8 小时前
认识Rust——我的第一个程序 Rust中文编程
开发语言·后端·rust
yqcoder8 小时前
JavaScript 柯里化:把“大餐”拆成“小炒”的艺术
开发语言·javascript·ecmascript
每天吃饭的羊8 小时前
JSZip的使用
开发语言·javascript
qq_589568108 小时前
java基础学习,案例练习,即时通讯
java·开发语言·学习
DevilSeagull8 小时前
Windows 批处理 (Batch) 编程: 从入门到入土. (一) 基础概念与环境配置
开发语言·windows·后端·batch·语言
逸Y 仙X8 小时前
文章十九: ElasticSearch Full Text 全文本查询
java·大数据·数据库·elasticsearch·搜索引擎·全文检索
AI科技星8 小时前
全域数学·第卷:场计算机卷(场空间计算机)【乖乖数学】
java·开发语言·人工智能·算法·机器学习·数学建模·数据挖掘