函数 ) 1、协程作用域构建器概念 2、coroutineScope 协程作用域构建器 示例 3、supervisorScope 协程作用域构建器 示例 一、结构化并发 ---- 在 【Kotlin...使用场景 : 协程任务取消 : 在不需要协程任务的时候 , 取消协程任务 ; 追踪协程任务 : 追踪正在执行的协程任务 ; 发出错误信号 : 如果 协程任务执行失败 , 发出错误信号 , 表明执行任务出错...构建器 是 结构化并发 的重要组成部分 ; 常用的 协程作用域构建器 有 coroutineScope 和 runBlocking ; runBlocking 是 普通函数 , 可以在 普通的代码位置使用..., 将 主线程 或 子线程 包装成 协程体 , 在该协程中执行 协程任务 , 会 阻塞当前的线程 ; 函数原型如下 : public actual fun runBlocking(context...协程体 中的所有 协程任务 和 子协程 执行完毕 ; 代码示例 : 在下面的代码中 , runBlocking 可以在普通的函数中执行 , 将主线程包装成了协程体 ; 但是 coroutineScope
: jobA finished main finished 我们在主协程(主线程的协程)中,手动调用jobA的join方法,那么主线程就会阻塞,直到jobA执行完毕。...jobA finished 这回我们没有构建新的协程作用域,而是在根协程中直接使用子协程的方式,当然了,协程的上下文继承关系,使得我们的主协程等待子协程执行完毕后才结束生命 例子4: fun `test...CrashHandler理解,不过它并不能阻止协程的退出,只能够获取异常的信息 它使用有两个条件: 1.异常是自动抛出异常(launch) 2.实例化CoroutineScope的时候指定异常捕获器 或者 在一个根协程中...java.lang.IllegalArgumentException 如果不包裹try catch 那么println("job delay")都不会执行 由例子4和例子5,我们可以推断,如果子协程有异常发生了,我们在等待时捕获异常后...,任务出现异常并且手动捕获异常后,再启动子协程时,也会抛出异常,并且不可捕获 注意:新版本kotlin已修复这个bug,不会抛出异常了 3.Android中全局异常的处理
receive 处抛出异常 ) 2、异常捕获点 ( 在 await、receive 处捕获异常 ) 四、非根协程异常处理 五、异常传播特性 一、协程异常处理 ---- 在 协程任务 中 , 执行的代码出现异常..., 会 马上抛出异常 ; 此类异常 在 可能出现异常的代码位置 进行捕获即可 ; 向用户暴露异常 : 使用 async 或 produce 构建器 创建的 根协程 , 如果出现异常 , 则需要 用户..., 会 马上抛出异常 ; 此类异常 在 可能出现异常的代码位置 进行捕获即可 ; 注意 : 下面讨论的情况是 根协程 的异常传播 ; 1、异常抛出点 ( 协程体抛出异常 ) launch 构建器 异常代码示例...: 使用 launch 构建器创建协程 , 在协程任务中抛出异常 , 查看异常的抛出点 ; package kim.hsl.coroutine import android.os.Bundle import...: 在第 19 行代码 , 也就是 throw ArithmeticException() 位置出现异常 , 说明 launch 构建器创建的协程抛出的异常是立即抛出 , 捕获异常也应该在该位置进行捕获
一方面是因为 Compose 的学习在个人来看重要性更高;另一方面就是,发现学完之前的 Kotlin 系列的笔记一到笔记三后,已经基本可以在项目中使用 Kotlin 进行日常的编码了,所以才导致这个 Kotlin...在 Kotlin 中,协程就是一个封装好的线程框架。类比于 Java 中的 Executor 或 Android 中的 AsyncTask。...而 resumeWith 方法就是协程的回调方法,执行失败或完成都会回调,就拿上面的代码,在Activity onCreate 方法中执行,就会输出下面的信息: 可以看出,通过 CoroutineName...比如,一旦父 job 被取消,其所有子 job 也会被取消;当一个子 job 由于出现异常导致执行失败,其父 job 和其他的子 job 也会立即被取消并抛出 CancellationException...await 是 Deferred 中的方法,可获取返回的结果数据。
出现异常终止收集元素操作 Flow 流收尾工作可以借助以下方案执行 : 在 finally 代码块中进行收尾工作 在 onCompletion 代码块中进行收尾 在 onCompletion 代码块中进行收尾...时 , 如果是 因为异常导致 Flow 流收集元素失败 , 则可以 在 onCompletion 代码块中拿到异常信息 ; 二、onCompletion 函数原型 ---- onCompletion...函数原型如下 : /** * 在**流完成或取消后,返回一个调用给定[action] **的流 * 作为[action]原因参数的取消异常或失败。...---- 在 onCompletion 代码块中进行收尾 时 , 如果是因为异常导致 Flow 流收集元素失败 , 则可以在 onCompletion 代码块中拿到异常信息 ; 注意 : 在 onCompletion...PID: 29378 SIG: 9 六、catch 代码块中捕获异常 ---- 上面章节中介绍了 在 Flow#onCompletion 中可以执行收尾 , 同时可以查看出现的异常 , 但是无法捕获处理异常
协程可以不依赖于线程直接运行在进程中; 协程通过提升CPU的利用率,进而减少线程切换,进而提升程序运行效率; 协程启动与停止都是由代码操作,而不是操作系统调度; Kotlin 协程练习 Kotlin 练习参考...// runBlocking 和 coroutineScope 主要的不同之处在于后者在等待所有的子协程执行完毕时并没有使当前线程阻塞 private fun testCoro() = runBlocking...() //等待的结果必须调用挂起或阻塞 runBlocking { print("result is ${one.await...挂起后,它将完全由所运行的线程中恢复挂起函数, //非受限调度器是合适的,它在协程没有消耗CPU时间或共享数据时被限制在指定线程中 fun testDispatcherMain() =...") } //父协程总是等待所有子协程执行结束,父协程不会跟踪子协程也不必调用join方法在最后等待子协程 /** * 输出 * request
第一个协程 在使用协程之前,需要保证Kotlin-Gradle-Plugin的版本高于1.3。目前最高的版本为1.3.11。...${Thread.currentThread().name}") // 协程已在等待时主线程还在继续 而打印出的结果为: Hello,...main World!......在该协程中delay(1000L)等待了1秒后再输出日志。...,可以看到: 直接在runBlocking中调用delay()会阻塞当前线程 在runBlocking中调用launch()会开启新的协程,并且不会阻塞当前线程 在runBlocking中调用launch...main @coroutine#1 CoroutineScope作用域 在runBlocking中可以定义一个coroutineScope,而该函数的作用是为在这个函数中启动的协程添加作用域,只有当作用域内的协程都执行完毕后
} println("Hello,") job.join() // 等待直到子协程执行结束 } 现在,结果仍然相同,但是主协程与后台作业的持续时间没有任何关系 当我们使用 GlobalScope.launch...虽然它很轻量,但它运行时仍会消耗一些内存资源。如果我们忘记保持对新启动的协程的引用,它还会继续运行。...另外,我们可以在 finally 中释放资源 fun main() = runBlocking { val job = launch { try { repeat...你可以使用 .await() 在一个延期的值上得到它的最终结果, 但是 Deferred 也是一个 Job,所以如果需要的话,你可以取消它。...在这个模式下,只有结果通过 await 获取的时候协程才会启动,或者在 Job 的 start 函数调用的时候。
: 1 2 3 4 5 Done I'm blocked 1 I'm blocked 2 I'm blocked 3 I'm blocked 4 I'm blocked 5 由此,可以得出 Flow 在使用各个...Flow VS RxJava Kotlin 协程库的设计本身也参考了 RxJava ,下图展示了如何从 RxJava 迁移到 Kotlin 协程。...Completion Flow 完成时(正常或出现异常时),如果需要执行一个操作,它可以通过两种方式完成:imperative、declarative。....collect { println(it) } } 4.3.3 onCompleted (借助扩展函数实现) 借助扩展函数可以实现类似 RxJava 的 onCompleted() 功能,只有在正常结束时才会被调用...该系列的相关文章: Kotlin Coroutines Flow 系列(一) Flow 基本使用 Kotlin Coroutines Flow 系列(三) 异常处理
Terminal flow operators 在 Kotlin Coroutines Flow 系列(一) Flow 基本使用 一文最后,我整理了 Flow 相关的 Terminal 操作符。...reduce 类似于 Kotlin 集合中的 reduce 函数,能够对集合进行计算操作。...即使 flowB 中的每一个 item 都使用了 delay() 函数,在合并过程中也会等待 delay() 执行完后再进行合并。...flatMapConcat 后,collect 函数在收集新值之前会等待 flatMapConcat 内部的 flow 完成。...Flow VS Reactive Streams 天生的多平台支持 由于 Kotlin 语言自身对多平台的支持,使得 Flow 也可以在多平台上使用。 互操作性 Flow 仍然属于响应式范畴。
挂起函数 在Kotlin Coroutine中,挂起函数是一种特殊的函数,它可以在协程内部被挂起,等待异步操作完成而不会阻塞线程。挂起函数是协程异步编程的核心。...suspend fun fetchUserData(): UserData { // 执行异步操作,等待数据返回 } 在协程中调用挂起函数 在协程内部调用挂起函数是直接的,你可以像调用普通函数一样调用挂起函数...} 挂起函数是Kotlin Coroutine中的重要组成部分,它允许在协程中优雅地处理异步操作。...创建协程作用域 在Kotlin中,我们可以使用CoroutineScope来创建协程作用域。...在UI线程中启动协程 Kotlin Coroutine允许我们在UI线程中启动协程,通过指定Dispatchers.Main调度器来实现。
, 在 select 代码块中 调用多个协程的 onAwait 函数 , 哪个协程先返回数据 , 就选择该协程的数据作为返回值 ; // 同时执行两个协程, 哪个先执行完毕, 就取哪个协程的执行结果...val data = select { localJob.onAwait{it} remoteJob.onAwait{it} } 在 select 代码块中 调用多个 Channel...所选子句的结果 * 成为选择的结果。如果有任何子句_fails_,则选择调用将生成 * 相应的异常。在本例中没有选择子句。 * * 这个选择函数是_biased_到第一个子句。...主要是在 select 代码块中实现 , 能够在 select 中执行的多路复用事件 , 称为 SelectClauseN 事件 : SelectClause0 事件 : 没有返回值 , 没有参数 ;...* * 如果通道[为' send '关闭][isClosedForSend](参见[close]了解详细信息),则[select]调用失败并出现异常。
协程不安全数据访问 二、使用 Atomic 并发安全类型 三、使用 Channel 通道 四、使用 Mutext 轻量级锁 五、使用 Semaphore 轻量级信号量 一、协程不安全数据访问 ---- 在多个线程中...同时访问 相同数据 , 就会出现 线程不安全 访问 的问题 ; 如果多个协程中 , 同时访问相同数据 , 同样会出现 不安全数据访问 问题 ; 协程不安全数据访问代码示例 : 同时开启 100000...使用 Mutext 轻量级锁 , 加锁 Mutext#lock , 解锁 Mutext#unlock , 如果执行时获取不到 Mutext 锁 , 会挂起等待 Mutext 锁释放 , 不会阻塞线程 ;...首先 , 创建 Mutex 锁 实例对象 ; val mutex = Mutex() 然后 , 将协程中的并发代码定义在 mutex.withLock 代码块内 ; GlobalScope.launch...可以同时定义多个 信号量 , 协程获取到 对应 信号量时才能执行并发任务 ; 首先 , 创建 Semaphore 信号量 实例对象 ; val semaphore = Semaphore(1) 然后 , 将协程中的并发代码定义在
Kotlin的一个协程可以理解为是运行在线程上的一个执行任务并且该任务可以在不同的线程间切换,一个线程可以同时运行多个协程。...方式因为会阻塞线程,所以runBlocking函数我们在开发中基本不会使用到,但可以用于代码调试。...提前说一下async和launch的区别: async函数体中最后一行代码表达式运行结果会作为结果返回,也就是Deferred中的泛型T,我们可以通过其他协程函数获取到这个执行结果,而launch没有这样的返回值...CoroutineScope(Dispatchers.IO).launch {} 是在指定的 CoroutineScope 中启动一个协程,通常情况下应该手动创建 CoroutineScope 对象,并确保在合适的时机取消该...最常见的,网络请求在IO线程,而页面更新在主线程。 Kotlin给我们提供了一个顶层函数withContext用于改变协程的上下文并执行一段代码。
· kotlin的协程和其他语言的协程有什么异同? kotlin的协程的出现其实比kotlin语言还晚一点。在当前这个版本,协程甚至都还处于一个不稳定的迭代版本中。...在Android中我们对IO操作的一个熟知的规则是不能写在主线程中,因为它会卡线程,导致ANR。而上面的代码其实是不会卡线程的。用同步的方式写异步代码 这句话在很多资料中出现过,划重点。...我们知道类似的技术在RxJava中也有,它通过手动切线程的方式指定代码运行所在的线程,从而达到不卡主线程的目的。而协程的高明和简洁之处在于,开发者不需要主动切线程。...在上面的代码中打印一下线程名观察结果。...在协程中有一个函数 runBlocking{},没接触过的可以简单理解为它等价于launch{}。
所以在实际应用中,我们更推荐 : 在执行操作所在指定作用域内启动协程,而非随意使用 协程的取消与超时 cancelAndJoin 取消一个协程并等待结束 runBlocking {...main-抛出异常 注意:如果其中一个子协程失败,则第一个 playGame 和等待中的父协程都会被取消 协程上下文和调度器 协程总是运行在以 coroutineContext 为代表的上下文中,协程上下文是各种不同元素的集合...在我们上面的代码中,suspend 我们经常见。 Flow 使用list返回结果,意味着我们会一次返回所有值,而使用Sequence虽然可以做到同步返回,但如果有耗时操作,又会阻塞我们的线程。...i }.let(::println) } 16 流是连续的 在kotlin中,流是按照顺序执行的。...注意:onReceiver 在已经该关闭的通道执行会发生失败并抛出异常,我们可以使用onReceiveOrNull 子句在关闭通道时执行特定操作
本质上可以说是一个单线程操作,只有开始收集时,上流代码才会启动,而Channel是一个并发安全的队列,可以用来连接不同的协程,实现不同协程之间的通信 1.Channel的使用 创建一个Channel对象,在不同协程中调用其...: 1 2 3 2.Channel的容量 Channel的容量或者说缓冲区大小,默认为0,当消费者消费慢了,那么生产者会等待,反之生产者生产慢了,消费者会等待。.../ println(value) // } } joinAll(producer,consumer) } 4.produce与actor 在协程中...三、并发安全 在Java平台上的kotlin协程实现避免不了并发调度的问题,因此线程安全值得留意 fun `test sync safe1`() = runBlocking { var count...中是进程间通讯的一种方式,协程获取到信号量后即可执行并发操作。
在协程中,通道是指提供了一种在Flow中传输值的方法。 提供了一种便捷的方法使得单个值可以在多个协程之间进行相互传输。 其实就类似我们学I/O流的时候,讲解的通道是一样的意思。 1....如果其中一个处理器协程执行失败,其它的处理器协程仍然会继续处理通道,而通过 consumeEach 编写的处理器始终在正常或非正常完成时消耗(取消)底层通道。 6....通道缓冲 在上面的示例中,所有的通道都是没有缓冲区的。而无缓冲的Channel在发送者和接收者相遇时传输元素(简称:对接)。如果发送先被调用,那么通道会挂起等待通道中的消息被接收。...kotlin.Unit 下一个元素在50毫秒内准备就绪: null 下一个元素在100毫秒内准备就绪: kotlin.Unit 消费者暂停150毫秒 下一个元素在消费者暂停延迟后立即使用: kotlin.Unit...消耗元素在停止150毫秒后,下一个元素在50毫秒内准备就绪: kotlin.Unit ticker 知道可能的消费者暂停,并且默认情况下会调整下一个生成的元素如果发生暂停则延迟,试图保持固定的生成元素率
修饰只是提醒kotlin这一块是一个耗时操作,避免卡顿。...4.runBlocking {}会等待所有子协程执行完毕 2、非阻塞式挂起:就是用阻塞式的代码写法,实现了非阻塞式的功能(同步代码写法实现异步任务) runBlocking本身会阻塞当前线程去等待...3、await()和join()都会阻塞当前父协程去等待子协程执行完毕,只是await()可以返回一个结果值 4、UNDISPATCHED:这个模式是立即执行,其他模式是立即调度或者等待调度,立即执行比立即调度优先级高...5、大写的CoroutineScope没有继承runBlocking协程的上下文,所以这种情况的runBlocking不会等待子协程CoroutineScope执行完毕。...1.首先,使用发送消息来同步信息相比于直接使用共享内存和互斥锁是一种更高级的抽象,使用更高级的抽象能够为我们在程序设计上提供更好的封装,让程序的逻辑更加清晰; 2.其次,消息发送在解耦方面与共享内存相比也有一定优势
Kotlin 协程概述 什么是协程:协程是轻量级的线程,能够在不阻塞线程的情况下执行异步任务。Kotlin 提供了简洁的 API 来管理协程。...展示如何在 Kotlin 中优雅地处理异步任务,而不会消耗过多资源。...异常处理:在协程中处理异常可以通过 try-catch或 CoroutineExceptionHandler,相较于 Java 异常处理更加简洁和统一。...job.cancelAndJoin() // 取消该任务并等待完成 println("Main: Now I can quit.") } 6....协程在 Android 和服务器端开发中的应用:Kotlin 协程在 Android 中已经成为标准,展示在 Android 和服务端应用中的实践。 8.
领取专属 10元无门槛券
手把手带您无忧上云