首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Kotlin 协程】协程启动 ⑤ ( 协程作用域构建器 | runBlocking 函数 | coroutineScope 函数 | supervisorScope 函数 )

函数 ) 1、协程作用域构建器概念 2、coroutineScope 协程作用域构建器 示例 3、supervisorScope 协程作用域构建器 示例 一、结构化并发 ---- Kotlin...使用场景 : 协程任务取消 : 不需要协程任务的时候 , 取消协程任务 ; 追踪协程任务 : 追踪正在执行的协程任务 ; 发出错误信号 : 如果 协程任务执行失败 , 发出错误信号 , 表明执行任务出错...构建器 是 结构化并发 的重要组成部分 ; 常用的 协程作用域构建器 有 coroutineScope 和 runBlocking ; runBlocking 是 普通函数 , 可以 普通的代码位置使用..., 将 主线程 或 子线程 包装成 协程体 , 该协程执行 协程任务 , 会 阻塞当前的线程 ; 函数原型如下 : public actual fun runBlocking(context...协程体 的所有 协程任务 和 子协程 执行完毕 ; 代码示例 : 在下面的代码 , runBlocking 可以普通的函数执行 , 将主线程包装成了协程体 ; 但是 coroutineScope

53030

kotlin--协程上下文、异常处理

: 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全局异常的处理

94310
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Kotlin 协程】协程异常处理 ① ( 根协程异常处理 | 自动传播异常 | 协程体捕获异常 | 向用户暴露异常 | await 处捕获异常 | 非根协程异常处理 | 异常传播特性 )

    receive 处抛出异常 ) 2、异常捕获点 ( await、receive 处捕获异常 ) 四、非根协程异常处理 五、异常传播特性 一、协程异常处理 ---- 协程任务 , 执行的代码出现异常..., 会 马上抛出异常 ; 此类异常 可能出现异常的代码位置 进行捕获即可 ; 向用户暴露异常 : 使用 async 或 produce 构建器 创建的 根协程 , 如果出现异常 , 则需要 用户..., 会 马上抛出异常 ; 此类异常 可能出现异常的代码位置 进行捕获即可 ; 注意 : 下面讨论的情况是 根协程 的异常传播 ; 1、异常抛出点 ( 协程体抛出异常 ) launch 构建器 异常代码示例...: 使用 launch 构建器创建协程 , 协程任务抛出异常 , 查看异常的抛出点 ; package kim.hsl.coroutine import android.os.Bundle import...: 第 19 行代码 , 也就是 throw ArithmeticException() 位置出现异常 , 说明 launch 构建器创建的协程抛出的异常是立即抛出 , 捕获异常也应该在该位置进行捕获

    73910

    Kotlin 学习笔记(四)—— 协程的基础知识,面试官的最爱了~

    一方面是因为 Compose 的学习个人来看重要性更高;另一方面就是,发现学完之前的 Kotlin 系列的笔记一到笔记三后,已经基本可以项目中使用 Kotlin 进行日常的编码了,所以才导致这个 Kotlin... Kotlin ,协程就是一个封装好的线程框架。类比于 Java 的 Executor 或 Android 的 AsyncTask。...而 resumeWith 方法就是协程的回调方法,执行失败或完成都会回调,就拿上面的代码,Activity onCreate 方法执行,就会输出下面的信息: 可以看出,通过 CoroutineName...比如,一旦父 job 被取消,其所有子 job 也会被取消;当一个子 job 由于出现异常导致执行失败,其父 job 和其他的子 job 也会立即被取消并抛出 CancellationException...await 是 Deferred 的方法,可获取返回的结果数据。

    1.5K30

    Kotlin 协程】Flow 流收尾工作 ( finally 代码块收尾 | onCompletion 代码块收尾 | onCompletion 获取异常信息 | catch 代码块捕获异常 )

    出现异常终止收集元素操作 Flow 流收尾工作可以借助以下方案执行 : finally 代码块中进行收尾工作 onCompletion 代码块中进行收尾 onCompletion 代码块中进行收尾...时 , 如果是 因为异常导致 Flow 流收集元素失败 , 则可以 onCompletion 代码块拿到异常信息 ; 二、onCompletion 函数原型 ---- onCompletion...函数原型如下 : /** * **流完成或取消后,返回一个调用给定[action] **的流 * 作为[action]原因参数的取消异常或失败。...---- onCompletion 代码块中进行收尾 时 , 如果是因为异常导致 Flow 流收集元素失败 , 则可以 onCompletion 代码块拿到异常信息 ; 注意 : onCompletion...PID: 29378 SIG: 9 六、catch 代码块捕获异常 ---- 上面章节中介绍了 Flow#onCompletion 可以执行收尾 , 同时可以查看出现的异常 , 但是无法捕获处理异常

    64820

    Kotlin 协程之Practice

    协程可以不依赖于线程直接运行在进程; 协程通过提升CPU的利用率,进而减少线程切换,进而提升程序运行效率; 协程启动与停止都是由代码操作,而不是操作系统调度; Kotlin 协程练习 Kotlin 练习参考...// runBlocking 和 coroutineScope 主要的不同之处在于后者等待所有的子协程执行完毕时并没有使当前线程阻塞     private fun testCoro() = runBlocking...()             //等待结果必须调用挂起或阻塞             runBlocking {                 print("result is ${one.await...挂起后,它将完全由所运行的线程恢复挂起函数,     //非受限调度器是合适的,它在协程没有消耗CPU时间或共享数据时被限制指定线程     fun testDispatcherMain() =...")     }       //父协程总是等待所有子协程执行结束,父协程不会跟踪子协程也不必调用join方法最后等待子协程     /**      * 输出      *  request

    1.2K20

    Android协程的7个必要知识点

    挂起函数 Kotlin Coroutine,挂起函数是一种特殊的函数,它可以协程内部被挂起,等待异步操作完成而不会阻塞线程。挂起函数是协程异步编程的核心。...suspend fun fetchUserData(): UserData { // 执行异步操作,等待数据返回 } 协程调用挂起函数 协程内部调用挂起函数是直接的,你可以像调用普通函数一样调用挂起函数...} 挂起函数是Kotlin Coroutine的重要组成部分,它允许协程优雅地处理异步操作。...创建协程作用域 Kotlin,我们可以使用CoroutineScope来创建协程作用域。...UI线程启动协程 Kotlin Coroutine允许我们UI线程启动协程,通过指定Dispatchers.Main调度器来实现。

    69052

    Kotlin 协程】协程的多路复用技术 ② ( select 函数原型 | SelectClauseN 事件 | 查看挂起函数是否支持 select )

    , select 代码块 调用多个协程的 onAwait 函数 , 哪个协程先返回数据 , 就选择该协程的数据作为返回值 ; // 同时执行两个协程, 哪个先执行完毕, 就取哪个协程的执行结果...val data = select { localJob.onAwait{it} remoteJob.onAwait{it} } select 代码块 调用多个 Channel...所选子句的结果 * 成为选择的结果。如果有任何子句_fails_,则选择调用将生成 * 相应的异常。本例没有选择子句。 * * 这个选择函数是_biased_到第一个子句。...主要是 select 代码块实现 , 能够 select 执行的多路复用事件 , 称为 SelectClauseN 事件 : SelectClause0 事件 : 没有返回值 , 没有参数 ;...* * 如果通道[为' send '关闭][isClosedForSend](参见[close]了解详细信息),则[select]调用失败出现异常

    1.2K20

    Kotlin 协程】协程并发安全问题 ( 使用 Atomic 并发安全类型 | 使用 Channel 通道 | 使用 Mutext 轻量级锁 | 使用 Semaphore 轻量级信号量 )

    协程不安全数据访问 二、使用 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) 然后 , 将协程的并发代码定义

    64220

    Kotlin的协程及Android的应用

    Kotlin的一个协程可以理解为是运行在线程上的一个执行任务并且该任务可以不同的线程间切换,一个线程可以同时运行多个协程。...方式因为会阻塞线程,所以runBlocking函数我们开发基本不会使用到,但可以用于代码调试。...提前说一下async和launch的区别: async函数体中最后一行代码表达式运行结果会作为结果返回,也就是Deferred的泛型T,我们可以通过其他协程函数获取到这个执行结果,而launch没有这样的返回值...CoroutineScope(Dispatchers.IO).launch {} 是指定的 CoroutineScope 启动一个协程,通常情况下应该手动创建 CoroutineScope 对象,并确保合适的时机取消该...最常见的,网络请求IO线程,而页面更新主线程。 Kotlin给我们提供了一个顶层函数withContext用于改变协程的上下文并执行一段代码。

    17210

    Kotlin协程开篇

    · kotlin的协程和其他语言的协程有什么异同? kotlin的协程的出现其实比kotlin语言还晚一点。在当前这个版本,协程甚至都还处于一个不稳定的迭代版本。...Android我们对IO操作的一个熟知的规则是不能写在主线程,因为它会卡线程,导致ANR。而上面的代码其实是不会卡线程的。用同步的方式写异步代码 这句话很多资料中出现过,划重点。...我们知道类似的技术RxJava也有,它通过手动切线程的方式指定代码运行所在的线程,从而达到不卡主线程的目的。而协程的高明和简洁之处在于,开发者不需要主动切线程。...在上面的代码打印一下线程名观察结果。...协程中有一个函数 runBlocking{},没接触过的可以简单理解为它等价于launch{}。

    89320

    Kotlin | 协程使用手册(不间断更新)

    所以实际应用,我们更推荐 : 执行操作所在指定作用域内启动协程,而非随意使用 协程的取消与超时 cancelAndJoin 取消一个协程并等待结束 runBlocking {...main-抛出异常 注意:如果其中一个子协程失败,则第一个 playGame 和等待的父协程都会被取消 协程上下文和调度器 协程总是运行在以 coroutineContext 为代表的上下文中,协程上下文是各种不同元素的集合...我们上面的代码,suspend 我们经常见。 Flow 使用list返回结果,意味着我们会一次返回所有值,而使用Sequence虽然可以做到同步返回,但如果有耗时操作,又会阻塞我们的线程。...i }.let(::println) } 16 流是连续的 kotlin,流是按照顺序执行的。...注意:onReceiver 已经该关闭的通道执行会发生失败并抛出异常,我们可以使用onReceiveOrNull 子句关闭通道时执行特定操作

    2.4K20

    kotlin--Channel、多路复用、并发安全

    本质上可以说是一个单线程操作,只有开始收集时,上流代码才会启动,而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...是进程间通讯的一种方式,协程获取到信号量后即可执行并发操作。

    97410

    Kotlin 协程 通道 Channel 介绍

    协程,通道是指提供了一种Flow传输值的方法。 提供了一种便捷的方法使得单个值可以多个协程之间进行相互传输。 其实就类似我们学I/O流的时候,讲解的通道是一样的意思。 1....如果其中一个处理器协程执行失败,其它的处理器协程仍然会继续处理通道,而通过 consumeEach 编写的处理器始终正常或非正常完成时消耗(取消)底层通道。 6....通道缓冲 在上面的示例,所有的通道都是没有缓冲区的。而无缓冲的Channel发送者和接收者相遇时传输元素(简称:对接)。如果发送先被调用,那么通道会挂起等待通道的消息被接收。...kotlin.Unit 下一个元素50毫秒内准备就绪: null 下一个元素100毫秒内准备就绪: kotlin.Unit 消费者暂停150毫秒 下一个元素消费者暂停延迟后立即使用: kotlin.Unit...消耗元素停止150毫秒后,下一个元素50毫秒内准备就绪: kotlin.Unit ticker 知道可能的消费者暂停,并且默认情况下会调整下一个生成的元素如果发生暂停则延迟,试图保持固定的生成元素率

    46610

    Kotlin协程知识累计

    修饰只是提醒kotlin这一块是一个耗时操作,避免卡顿。...4.runBlocking {}会等待所有子协程执行完毕 2、非阻塞式挂起:就是用阻塞式的代码写法,实现了非阻塞式的功能(同步代码写法实现异步任务) runBlocking本身会阻塞当前线程去等待...3、await()和join()都会阻塞当前父协程去等待子协程执行完毕,只是await()可以返回一个结果值 4、UNDISPATCHED:这个模式是立即执行,其他模式是立即调度或者等待调度,立即执行比立即调度优先级高...5、大写的CoroutineScope没有继承runBlocking协程的上下文,所以这种情况的runBlocking不会等待子协程CoroutineScope执行完毕。...1.首先,使用发送消息来同步信息相比于直接使用共享内存和互斥锁是一种更高级的抽象,使用更高级的抽象能够为我们程序设计上提供更好的封装,让程序的逻辑更加清晰; 2.其次,消息发送解耦方面与共享内存相比也有一定优势

    22310
    领券