Kotlin Coroutines 笔记 (一)

Kotlin 协程(Coroutines)详解 阅读详情

在这里插入图片描述

一. 协程
Kotlin 在1.1版本之后引入了协程的概念,目前它还是一个试验的API。

在操作系统中,我们知道进程和线程的概念以及区别。而协程相比于线程更加轻量级,协程又称微线程。

协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

Kotlin 的协程是无阻塞的异步编程方式。Kotlin 允许我们使用协程来代替复杂的线程阻塞操作,并且复用原本的线程资源。

Kotlin 的协程是依靠编译器实现的, 并不需要操作系统和硬件的支持。编译器为了让开发者编写代码更简单方便, 提供了一些关键字(例如suspend), 并在内部自动生成了一些支持型的代码。

先举两个例子来说明协程的轻量级,分别创建10w个协程和10w个线程进行测试。

import kotlinx.coroutines.experimental.CommonPool
import kotlinx.coroutines.experimental.delay
import kotlinx.coroutines.experimental.launch
import kotlinx.coroutines.experimental.runBlocking

/**

  • Created by tony on 2018/7/18.
    */
    fun main(args: Array) {

    val start = System.currentTimeMillis()

    runBlocking {
    val jobs = List(100000) {
    // 创建新的coroutine
    launch(CommonPool) {
    // 挂起当前上下文而非阻塞1000ms
    delay(1000)
    println(“thread name=”+Thread.currentThread().name)
    }
    }

     jobs.forEach {
         it.join()
     }
    

    }

    val spend = (System.currentTimeMillis()-start)/1000

    println(“Coroutines: spend= $spend s”)

}

10w个协程的创建在本机大约花费 1 秒,经过测试100w个协程的创建大约花费11 秒。
在这里插入图片描述

十万个协程测试.jpeg

import kotlin.concurrent.thread

/**

  • Created by tony on 2018/7/18.
    */
    fun main(args: Array) {

    val start = System.currentTimeMillis()

    val threads = List(100000) {
    // 创建新的线程
    thread {
    Thread.sleep(1000)
    println(Thread.currentThread().name)
    }
    }

    threads.forEach { it.join() }

    val spend = (System.currentTimeMillis()-start)/1000

    println(“Threads: spend= $spend s”)

}
在这里插入图片描述

十万个线程测试.jpeg

10w个线程的创建出现了OutOfMemoryError。

二. 协程常用的基本概念
2.1 CoroutineContext
协程上下文,它包含了一个默认的协程调度器。所有协程都必须在 CoroutineContext 中执行。

2.2 CoroutineDispatcher
协程调度器,它用来调度和处理任务,决定了相关协程应该在哪个或哪些线程中执行。Kotlin 的协程包含了多种协程调度器。

2.3 Continuation
按照字面意思是继续、持续的意思。协程的执行可能是分段执行的:先执行一段,挂起,再执行一段,再挂起…

Continuation 则表示每一段执行的代码,Continuation 是一个接口。

2.4 Job
任务执行的过程被封装成 Job,交给协程调度器处理。Job 是一种具有简单生命周期的可取消任务。Job 拥有三种状态:isActive、isCompleted、isCancelled。

                                                  wait children
+-----+       start      +--------+   complete   +-------------+  finish  +-----------+
| New | ---------------> | Active | -----------> | Completing  | -------> | Completed |
+-----+                  +--------+              +-------------+          +-----------+
   |                         |                         |
   | cancel                  | cancel                  | cancel
   V                         V                         |

±----------+ finish ±-----------+ |
| Cancelled | <--------- | Cancelling | <----------------+
|(completed)| ±-----------+
±----------+

2.5 Deferred
Deferred 是 Job 的子类。Job 完成时是没有返回值的,Deferred 可以为任务完成时提供返回值,并且Deferred 新增了一个状态 isCompletedExceptionally。

                                                wait children

±----+ start ±-------+ complete ±------------+ finish ±----------+
| New | ---------------> | Active | ----------> | Completing | —±> | Resolved |
±----+ ±-------+ ±------------+ | |(completed)|
| | | | ±----------+
| cancel | cancel | cancel |
V V | | ±----------+
±----------+ finish ±-----------+ | ±> | Failed |
| Cancelled | <--------- | Cancelling | <---------------+ |(completed)|
|(completed)| ±-----------+ ±----------+
±----------+

2.6 suspend 关键字
协程计算可以被挂起而无需阻塞线程。我们使用 suspend 关键字来修饰可以被挂起的函数。被标记为 suspend 的函数只能运行在协程或者其他 suspend 函数中。

suspend 可以修饰普通函数、扩展函数和 lambda 表达式。

三. 协程的多种使用方式
Kotlin 的协程支持多种异步模型:

在这里插入图片描述

Kotlin协程支持的异步模型.png

这些异步机制在 Kotlin 的协程中都有实现。

Kotlin 官方对协程提供的三种级别的能力支持, 分别是: 最底层的语言层, 中间层标准库(kotlin-stdlib), 以及最上层应用层(kotlinx.coroutines)。

3.1 协程的hello world版本
使用 launch 和 async 都能启动一个新的协程。

val job = launch {
    delay(1000)
    println("Hello World!")
}

Thread.sleep(2000)

或者

val deferred  = async {

    delay(1000)
    println("Hello World!")
}

Thread.sleep(2000)

它们分别会返回一个 Job 对象和一个 Deferred 对象。

下面使用 runBlocking 来创建协程。

fun main(args: Array) = runBlocking {
launch {
delay(1000)
println(“Hello World!”)
}

delay(2000)

}

runBlocking 创建的协程直接运行在当前线程上,同时阻塞当前线程直到结束。

launch 和 async 在创建时可以使用不同的CoroutineDispatcher,例如:CommonPool。

在 runBlocking 内还可以创建其他协程,例如launch。反之则不行。

总结

Kotlin 的协程能够简化异步编程的代码,使用同步的方式实现异步。协程的概念和理论比较多,第一篇只是一个开始,只整理了其中一些基本概念。

更多的Kotlin学习资料可以扫码免费领取!

《史上最详Android版kotlin协程入门进阶实战》

第一章 Kotlin协程的基础介绍

            ● 协程是什么

            ● 什么是Job 、Deferred 、协程作用域

            ● Kotlin协程的基础用法

img

第二章 kotlin协程的关键知识点初步讲解

            ● 协程调度器

            ● 协程上下文

            ● 协程启动模式

            ● 协程作用域

            ● 挂起函数

img

第三章 kotlin协程的异常处理

            ● 协程异常的产生流程

            ● 协程的异常处理

img

第四章 kotlin协程在Android中的基础应用

            ● Android使用kotlin协程

            ● 在Activity与Framgent中使用协程

            ● ViewModel中使用协程

            ● 其他环境下使用协程

img

第五章 kotlin协程的网络请求封装

            ● 协程的常用环境

            ● 协程在网络请求下的封装及使用

            ● 高阶函数方式

            ● 多状态函数返回值方式
基于STM32的Keil5代码自动补全设置操作指南 掌握Keil5代码自动补全设置技巧,提升STM32开发效率。通过合理配置编辑器选项,实现智能提示与语法补全,让嵌入式编程更流畅,尤其适合使用keil5代码自动补全设置的开发者快速上手。 阅读详情

相关推荐

自动驾驶仿真工具链集成:ECU TEST与VTD、VERISTAND的深度配置指南

本文详细介绍了自动驾驶仿真测试中ECU TEST、VTD与VERISTAND三大核心工具的深度集成与连接配置方法。通过解析工具链的角色分工,提供从单机到分布式部署的实战指南,并重点阐述了Test Bench Configuration与Test Configuration的关键参数设置、SSH免密登录配置,以及在线与离线工作模式的切换技巧,旨在帮助测试工程师高效构建稳定、自动化的硬件在环测试环境。

wind6的博客 790

kotlin协程_Kotlin协程

kotlin协程In this tutorial, we’ll be looking into Kotlin Coroutines. Coroutines is a vital concept since asynchronous programming is the way to go over the traditional blocking a thread and polling stuf...

从零开始的教程世界 693

MT6768平台Sensor Bring Up全流程实战:从驱动添加到问题排查(附避坑指南)

本文详细介绍了联发科MT6768平台Sensor Bring Up的全流程实战指南,从驱动添加、硬件配置到问题排查,提供了全面的避坑建议。内容涵盖环境准备、驱动文件集成、硬件接口配置、编译系统适配以及常见问题解决方案,帮助开发者高效完成传感器集成与调试工作。

weixin_30374009的博客 416

《Kotlin从小白到大牛》第20章:协程

第20章 协程 上一章介绍了线程,本章介绍的协程与线程类似都可以处理并发任务。协程在很多语言中都支持,但Java没有协程支持,Kotlin支持协程编程。本章介绍协程。 20.1 协程介绍 协程(Coroutines)是一种轻量级的线程,协程提供了一种不阻塞线程,但是可以被挂起的计算过程。线程阻塞开销是巨大的,而协程挂起基本上没有开销。 在执行阻塞任务时,会将这种任务放到子线程中执行,执行完成再回调(callback)主线程,更新UI等操作,这就是异步编程。协程底层库也是异步处理阻塞任务,但是这些复杂的操作被

weixin_38072116的博客 335

瑞芯微RK3568开发板实战:Android11系统parameter.txt文件配置全解析(附常见问题排查)

本文深入解析了瑞芯微RK3568开发板在Android 11系统下parameter.txt文件的配置要点与实战技巧。作为BootLoader启动阶段的核心蓝图,该文件决定了硬件初始化、分区布局及电源管理。文章详细拆解了身份标识、GPIO控制(PWR_HLD)、命令行参数及分区表等关键字段的配置逻辑,并针对RK3568平台与Android 11特性提供了专项适配策略,最后附带了启动失败、分区异常等常见问题的深度排查方法。

php55的博客 895

【Cadence】Virtuoso@LayoutXL 差分电路版图同步修改

对于差分电路,器件和部分走线通常是对称的,只需要画一半,另一半通过镜像操作完成。因此,需要对差分电路进行同步的修改,保证电路的差分对称性和正确的连接关系。然而,通常版图会经过多次修改,修改的部分可能在镜像的时候被遗漏。左边画了金属块,右边也出现了同步出现了金属块。进入group会有同步复制的提示。

乾巽的博客 3049

Kotlin协程 ——从 runBlocking 与 coroutineScope 说起

关于协程我们不多阐述,详细内容请查看官方文档,本文只谈谈 runBlocking与 coroutineScope。 runBlocking 我们先来看看 runBlocking 文档是如何描述该函数的: Runs a new coroutine and blocks the current thread interruptibly until its completion. This funct...

Junerver的博客 2万+

JaCoCo报告聚合的5个常见坑点排查指南:从单模块到多模块的完整避坑手册

本文详细解析了JaCoCo在多模块Maven项目中生成聚合报告时的5个常见问题,包括多模块报告聚合失效、覆盖率数据不一致、增量构建导致的覆盖率丢失等,并提供了具体的配置示例和解决方案。帮助开发者高效排查和解决JaCoCo报告聚合中的各种疑难杂症,提升代码覆盖率分析的准确性和效率。

weixin_27918373的博客 250

kotlin协程runBlocking和coroutineScope(三)

文章目录一、前言二、相关依赖三、runBlocking和coroutineScope四、为什么runBlocking可以直接启动协程五、launch、async三、参考链接 一、前言 虽然之前已经讲了两篇协程,不过本篇还是协程基础。本篇主要是从kotlin官网上了解的关于协程的相关内容 二、相关依赖 如果只是使用协程的话,可以使用下面的依赖。下面的库并不依赖于Android环境: dependencies { implementation 'org.jetbrains.kotlinx:kotlinx

Mr_Tony的专栏 1412

华为OD新系统机试真题 4.26 -最大化游戏试玩资格分发

华为OD机试新系统真题【最大化游戏试玩资格分发】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统机试 4月26号真题【最大化游戏试玩资格分发】。

qq_45776114的博客 825

车辆网络安全ISO/SAE 21434解读(一)概述

ISO/SAE 21434 《道路车辆 网络安全工程》是SAE和ISO共同制定的一项针对道路车辆的网络安全标准,它是一个面向汽车行业全供应链(OEM及各级供应商)的车辆网络安全管理指导文件

xiaoxiabang的博客 8425

深入理解 Kotlin coroutine (二)

其实能做到这一点的本质原因,我们已经在上一篇文章当中提到过,一台服务器开 1k 线程和 1k 协程来响应服务,前者对资源的消耗必然很大,而后者可能只是基于很少的几个或几十个线程来工作的,随着请求数量的增加,协程的优势可能会体现的更加明显。其实,如果你自己做过对线程任务的取消,你大概会知道除非被取消的线程自己去检查取消的标志位,或者被 interrupt,否则取消是无法实现的,这有点儿像一个人执意要做一件事儿,另一个人说你别做啦,结果人家压根儿没听见,你说他能停下来吗?顺序获取两张图片,耗时,不经济。

Z70czd的博客 352

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

coroutine倒计时 kotlin_Kotlin Coroutines 笔记 (一)

安静的妹子.jpg一. 协程Kotlin 在1.1版本之后引入了协程的概念,目前它还是一个试验的API。在操作系统中,我们知道进程和线程的概念以及区别。而协程相比于线程更加轻量级,协程又称微线程。协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没...

weixin_39711441的博客 185

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Kotlin: Coroutines协程学习笔记(一)

一、什么是协程 协程是一种协作式的计算机程序并发调度的实现,程序可以主动挂起或者恢复执行,本质上,协程是轻量级的线程。 二、协程和线程的关系和区别 1、协程是协作式的,线程是抢占式的。协程是由程序来控制什么时候进行切换的,而线程是有操作系统来决定线程之间的切换的。 2、一个线程可以包含多个协程。但是有一点必须明确的是,一个线程的多个协程的运行是串行的。 3、和多线程比,协程没有线程切换的开销,执行效率更高,性能更具优势。因而协程适合io密集型的程序,多线程适合计算密集型的程序(适用于多核cpu的情

KWMax 321

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Kotlin Coroutines与Flow在Pokedex中的异步编程技巧

Kotlin Coroutines与Flow是现代Android开发中处理异步操作的强大工具,在Pokedex这个基于Kotlin Multiplatform构建的应用中得到了充分应用。本文将分享Pokedex项目中使用Coroutines和Flow实现高效异步编程的实用技巧,帮助开发者掌握在跨平台应用中处理并发任务的最佳实践。 ## 1. 合理使用Coroutine Dispatchers优化

gitblog_00384的博客 1116

使用 IntelliJ IDEA 调试 Kotlin Flow:基于 kotlinx.coroutines 的完整实战教程

本篇教程基于当前仓库(kotlinx.coroutines)的官方文档与源码,完整演示如何在 IntelliJ IDEA 中创建、构建并逐步调试 Kotlin Flow:从设置断点、观察 Debug 工具窗口中的调用栈与协程状态,到借助 `buffer()` 让发射者与收集者并发运行并分别调试两个协程。读完后,你将掌握用 IDEA 的 **Coroutines** 标签页定位挂起点、识别 "was

gitblog_00738的博客 693

KMP-ObservableViewModel版本选择指南:Kotlin、Coroutines与AndroidX Lifecycle兼容性对照表

KMP-ObservableViewModel(前身为KMM-ViewModel)是一款强大的跨平台库,让开发者能够在SwiftUI中无缝使用AndroidX/Kotlin ViewModels。本文将为你提供最新的版本选择指南,帮助你轻松匹配Kotlin、Coroutines与AndroidX Lifecycle的最佳兼容组合,确保项目稳定运行。 ## 🌟 核心兼容性速查表 选择正确的库版

gitblog_00277的博客 955

在 IntelliJ IDEA 中调试 Kotlin 协程:kotlinx.coroutines 调试实战教程

本教程以 kotlinx.coroutines 仓库中的官方调试指南([docs/topics/debug-coroutines-with-idea.md](https://link.gitcode.com/i/2035623ac4abed43a00524e4e83a40d7))为骨架,完整演示如何在 IntelliJ IDEA 中创建协程、设置断点,并通过 **Coroutines** 调试面板

gitblog_00286的博客 1057

kotlinx.coroutines 升级 Kotlin 版本完整操作指南(KOTLIN_UPGRADE Checklist 实践)

> 本指南以仓库根目录 [KOTLIN_UPGRADE.md](https://link.gitcode.com/i/bc950aa5c724ff6b91bc691979bdac3e) 为骨架,系统讲解 kotlinx.coroutines 维护者在跟随新版 Kotlin 发布时所需的完整升级流程:从创建分支、同步版本号、更新 README 与 Playground 链接,到全量构建验证、CI 与

gitblog_00045的博客 676

Kotlin Coroutines 项目教程

Kotlin Coroutines 项目教程 1. 项目介绍 Kotlin Coroutines 是一个用于支持 Kotlin 协程的库,提供了多平台支持。协程是 Kotlin 中用于简化异步编程的一种并发设计模式。通过协程,开发者可以更轻松地管理长时间运行的任务,从而提高应用程序的性能和响应性。 2. 项目快速启动 2.1 环境准备 确保你已经安装了 Kotlin 编译器和 Gradle 构建工...

gitblog_00796的博客 457

kotlin coroutines 协程教程(一)基本用法

kotlin coroutines 协程 Coroutine 协程,是kotlin 上的一个轻量级的线程库,对比 java 的 Executor,主要有以下特点: 更轻量级的 api 实现协程 async 和 await 不作为标准库的一部分 suspend 函数,也就是挂起函数是比 java future 和 promise 更安全并且更容易使用 那么实际本质上和线程池有什么区别呢?我的理...

花不掉泪的博客 3054

Kotlin Coroutines 教程

Kotlin Coroutines 教程 项目介绍 Kotlin Coroutines 是一个轻量级的并发编程框架,旨在简化异步编程和并发操作。它提供了易于理解和使用的高级 API,使得开发者能够更高效地处理异步任务和并发问题。Kotlin Coroutines 的核心概念包括协程(Coroutine)、挂起函数(Suspending Function)和作用域(Scope),这些概念共同构成了 ...

gitblog_01159的博客 1112

使用Kotlin Coroutines实现Java应用的高并发与非阻塞I/O

通过以上介绍,我们了解了如何使用 Kotlin Coroutines 在 Java 应用中实现高并发和非阻塞 I/O。Coroutines 提供了一种轻量级的并发机制,可以显著提高应用的性能和可维护性。通过逐步引入 Kotlin Coroutines,我们可以充分利用 Kotlin 的优势,提升现有 Java 项目的并发处理能力。希望今天的分享对你有所帮助!

weixin_41455464的博客 1352

【Coroutines】Deep and Deep Into Kotlin Coroutines

【代码】【Coroutines】Deep and Deep Into Kotlin Coroutines

天天向上 Up Up Up (*^▽^*) 2092
上一篇: 为什么Android程序员都转向车载应用开发
下一篇: Kotlin Coroutines 笔记 (二)
网络安全-XG
博客等级 码龄5年 1万+粉丝 2752原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值