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

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

文章目录 一、结构化并发 二、作用域构建器 ( runBlocking 函数 | coroutineScope 函数 ) 二、作用域构建器 ( coroutineScope 函数 | supervisorScope...函数 ) 1、作用域构建器概念 2、coroutineScope 作用域构建器 示例 3、supervisorScope 作用域构建器 示例 一、结构化并发 ---- 在 【Kotlin...底层实现 ② ( 调度器 | 任务泄漏 | 结构化并发 ) 【Kotlin 底层实现 ③ ( 结构化并发 | MainScope 作用域 | 取消协作用域 | Activity...实现 CoroutineScope 作用域接口 ) 【Kotlin 底层实现 ④ ( 结构化并发 | viewModelScope 作用域示例 ) 博客中介绍了 结构化并发 ; 结构化并发的作用...( coroutineScope 函数 | supervisorScope 函数 ) ---- 1、作用域构建器概念 coroutineScope 函数 构建的 作用域 , 如果有一个 子

46830

Kotlin 异常处理 ② ( SupervisorJob | supervisorScope 作用域构建器函数 )

文章目录 一、SupervisorJob 二、supervisorScope 作用域构建器函数 在上一篇博客介绍了 异常处理 【Kotlin 异常处理 ① ( 根异常处理..., 会将异常 传递给 父 , 父会执行如下操作 : ① 取消子 : 不仅仅取消产生异常的子 , 该父下所有的子都会取消 ; ② 取消父 : 将父本身取消 ; ③ 向父的父传播异常...; SupervisorJob 实现 : 创建 SupervisorJob , 需要先 创建一个 作用域 , 在 CoroutineScope 构造函数 中 传入 SupervisorJob...作用域 调用 launch 构建器函数 , 即可 创建 SupervisorJob , 这些可以自己处理异常 , 不会向父传递异常 ; 代码示例 : // 先创建 Supervisor...作用域构建器函数 ---- 使用 supervisorScope 作用域构建器函数 , 可以直接创建一个 SupervisorScope 作用域 , 在该作用域中定义的 , 都是 SupervisorJob

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

Kotlin 启动 ③ ( 组合并发 | 挂起函数串行执行 | 组合并发执行挂起函数 )

文章目录 一、挂起函数串行执行 二、组合并发执行挂起函数 一、挂起函数串行执行 ---- 在体中 , 连续使用多个挂起函数 , 这些函数的执行是顺序执行的 , 挂起函数 1 执行完毕后 , 才执行..., 可以将 主线程 包装成 // measureTimeMillis 函数用于测量内部代码块执行的时间, 单位毫秒 ms val time =...577 ms 二、组合并发执行挂起函数 ---- 如果想要两个挂起函数并发执行 , 并且同时需要两个函数的返回值 , 则使用 async 构建器 , 启动两个协 , 在体中执行两个并发函数..., 可以将 主线程 包装成 // measureTimeMillis 函数用于测量内部代码块执行的时间, 单位毫秒 ms val time =...} suspend fun hello2(): Int { delay(300) return 2 } } 执行结果 : 启动两个 async

63020

Kotlin-特殊的阻塞

阻塞是种特殊的启动方式,一般是用 runBlocking{} 扩起来一段。...首先是父得到执行,然后才是子。 重点是这两段都在同一个线程main里完成。这里就带来一个有趣的问题, runBLocking{}和平时常用的launch有什么区别?...这里给出结果,改用GlobalScope.launch之后,子会在一个独立的线程里运行。 runBlocking 在kotlin官网上对于这个api的解释是桥接阻塞与非阻塞的世界。...在创建完coroutine后就进入派发流程了,这部分和Kotlin-一个的生命周期中的逻辑比较相似,下面也会讲到。...这个问说明,runBLocking{}这种,它的运行逻辑是先把父放队列里,然后取出来执行,执行完毕再把子入队,再出队子,用同样的方式递归。

2.3K20

Kotlin 总结

不过,我们学习 Kotlin 中的,一开始确实可以从线程控制的角度来切入。因为在 Kotlin 中,的一个典型的使用场景就是线程控制。...c.suspend suspend是 Kotlin 最核心的关键字,几乎所有介绍 Kotlin 的文章和演讲都会提到它。它的中文意思是「暂停」或者「可挂起」。...所以这个 suspend,其实并不是起到把任何把挂起,或者说切换线程的作用。 真正挂起这件事,是 Kotlin框架帮我们做的。...所以我们想要自己写一个挂起函数,仅仅只加上 suspend 关键字是不行的,还需要函数内部直接或间接地调用到 Kotlin 框架自带的 suspend 函数才行。 3.suspend 的意义?...4,Kotlin 的实战 5,漫画:什么是? 向大佬们致敬。

2.5K11

Kotlin开篇

Kotlin》均基于Kotlinx-coroutines 1.3.70 新开个坑,专门讲kotlin。聊程之前先说一下具体聊的是的什么内容。 · 是什么? · 什么时候用?...· 的核心是什么? · kotlin和其他语言的有什么异同? kotlin的出现其实比kotlin语言还晚一点。在当前这个版本,甚至都还处于一个不稳定的迭代版本中。...存活 } 上面的代码是一个常规启动的方式,关键函数只有 launch,delay,这两个函数kotlin独有的。...在中有一个函数 runBlocking{},没接触过的可以简单理解为它等价于launch{}。...python的是基于yield关键字进行二次封装的,虽然在高层抽象上也是以函数作为粒度,但对比golang差的太远。

87020

破解 Kotlin (5) - 取消篇

关键词:Kotlin 取消 任务停止 的任务的取消需要靠内部调用的协作支持,这就类似于我们线程中断以及对中断状态的响应一样。 1. 线程的中断 我们先从大家熟悉的话题讲起。...null.")) } }) } 我们这里用到了 suspendCancellableCoroutine,而不是之前的 suspendCoroutine,这就是为了让我们的挂起函数支持的取消...再谈 Retrofit 的扩展 4.1 Jake Wharton 的 Adapter 存在的问题 我在破解 Kotlin - 入门篇(https://www.bennyhuo.com/2019...直接解决还是比较困难的,因为 CompletableDeferred 构造所处的调用环境不是 suspend 函数,因而也没有办法拿到(很可能根本就没有!)父。...最后我们还分析了一下 Retrofit 的扩展的一些问题和解决方法,这个例子也进一步可以引发我们对作用域以及如何将现有程序化的思考。

1.7K50

破解 Kotlin (2) - 启动篇

另外,main 函数省略参数也是 Kotlin 1.3 的特性。后面的示例没有特别说明都是直接运行在 suspend main 函数当中。...在 Nodejs 中,Kotlin 的默认调度器则并没有实现线程的切换,输出结果也会略有不同,这样似乎更符合 JavaScript 的执行逻辑。 更多调度器的话题,我们后续还会进一步讨论。...对于 ATOMIC 模式,我们已经讨论过它一定会被启动,实际上在遇到第一个挂起点之前,它的执行是不会停止的,而 delay 是一个 suspend 函数,这时我们的迎来了自己的第一个挂起点,恰好 delay...我们在前面提到我们的示例都运行在 suspend main 函数当中,所以 suspend main 函数会帮我们直接启动一个,而我们示例的都是它的子,所以这里 5 的调度取决于这个最外层的的调度规则了...相信大家读完对于的执行机制有了一个大概的认识,同时对于的调度这个话题想必也非常好奇或者感到困惑,这是正常的——因为我们还没有讲嘛,放心,调度器的内容已经安排了 : ) 附录 log 函数的定义:

95930

Kotlin 的挂起和恢复 ① ( 的挂起和恢复概念 | 的 suspend 挂起函数 )

文章目录 一、的挂起和恢复概念 二、的 suspend 挂起函数 一、的挂起和恢复概念 ---- 函数 最基本的操作 是 : 调用 call : 通过 函数名或函数地址 调用函数 ; 返回...return : 函数执行完毕后 , 继续执行函数调用的下一行代码 ; 在 调用 call 和 返回 return 基础上 , 又新增了两种 状态 : 挂起 Suspend : 暂停当前执行的..., 只能在 体内部 或者 其它挂起函数 中调用 ; 外部不允许使用挂起函数 ; 在中 , 执行 挂起 Suspend 函数 , 将 挂起点的信息 记录下来 , 然后执行耗时操作 , 执行完毕后...() { // 函数体 } 如果在 函数 A 中调用上述 Test 挂起函数 , 则 函数 A 也必须是 挂起函数 ; 在中 , GlobalScope.launch(Dispatcher.Main...){} 中 , 可以直接调用挂起函数 ; 挂起 函数 , 只能在 体内部 或者 其它挂起函数 中调用 ; 外部不允许使用挂起函数 ; 在中 , 执行 挂起 Suspend 函数 , 将 挂起点的信息

1.5K40

破解 Kotlin (6) - 挂起篇

关键词:Kotlin 挂起 任务挂起 suspend 非阻塞 的挂起最初是一个很神秘的东西,因为我们总是用线程的概念去思考,所以我们只能想到阻塞。不阻塞的挂起到底是怎么回事呢?...简单来说就是,对于 suspend 函数,不是一定要挂起的,可以在需要的时候挂起,也就是要等待的还没有执行完的时候,等待执行完再继续执行;而如果在开始 join 或者 await 或者其他 suspend...函数,如果目标已经完成,那么就没必要等了,直接拿着结果走人即可。...就是 Kotlin 编译之后产生的字节码。...当然,字节码是比较抽象的,我这样写出来就是为了让大家更容易的理解是如何执行的,看到这里,相信大家对于的本质有了进一步的认识: 的挂起函数本质上就是一个回调,回调类型就是 Continuation

1.1K30

破解 Kotlin (3) - 调度篇

关键词:Kotlin 异步编程 上一篇我们知道了启动的几种模式,也通过示例认识了 launch 启动的使用方法,本文将延续这些内容从调度的角度来进一步为大家揭示的奥义。 ? 1....上下文 调度器本质上就是一个上下文的实现,我们先来介绍下上下文。...我们通过 launch启动了一个,为它指定了我们自己的拦截器作为上下文,紧接着在其中用 async 启动了一个, async 与 launch 从功能上是同等类型的函数,它们都被称作协的 Builder...Kotlin 设计者也特别害怕大家注意不到这一点,还特地废弃了两个 API 并且开了一个 issue 说我们要重做这套 API,这两个可怜的家伙是谁呢?...通过这个例子我们可以知道,实际上启动一个只需要有一个 lambda 表达式就可以了,想当年 Kotlin 1.1 刚发布的时候,我写了一系列的教程都是以标准库 API 为基础的,后来发现标准库的 API

73020

Kotlin系列(二)

在进行业务开发时,我们通常会基于官方的框架(kotlinx.coroutines)来运用Kotlin优化异步逻辑,不过这个框架过于庞大和复杂,如果直接接触它容易被劝退。...的描述类,官方给出的名字是Job,和线程的描述类Thread相比,Job同样有join函数,调用时会挂起,直到它的完成,它的cancel函数可以对应Thread的interrupt函数,用于取消协...3.1无返回值的launch函数     如果一个的返回值时Unit,我们可以称它为无返回值的,对于这样的,我们只需要启动它即可,下面我们给出launch函数的定义: fun launch(context...3.2实现join函数     join函数是一个挂起函数,他需要等待的执行,此时会有两种情况:被等待的已经执行完成,join函数就不会挂起,而是立马返回;被等待的尚未完成,此时join将挂起...,首先定义一个挂起函数,然后用delay(1000)函数来模拟耗时操作,然后我们用async启动,并获取的返回值,代码如下: suspend fun getValue():String{

22310

【翻译】深入 Kotlin

【翻译】深入 Kotlin 2017-10-26 by Liuqingwen | Tags: Kotlin 翻译 | Hits ? 一、前言 翻译好的文章也是一种学习方法!...原文作者:Adrian Bukros 二、正文 编写 Kotlin 相关的文章是当下比较流行的一个话题,这当然是有极好的理由支撑着的。...如何使用基于一种新的函数类型,叫做挂起函数。我们可以在函数名称前使用一种新的语言关键字 suspend 来标记。用这个关键字标记的函数能够暂停一个的执行,且不会阻塞当前线程。...在 C# 5.0 中,追溯到 2012 年,关于异步函数微软提出了一个特性,非常类似 Kotlin 中的: public async Task doWork() { // do some...在 C# 中 async 和 await 都是关键字 在 C# 中 async 函数只能返回一个 Task 实例或者返回空 如果你仔细观察的这个例子,你会看到在 Kotlin 中, launch{}

1.4K10

Kotlin | 是什么?

所以请打开Kotlin中文网。很多人说kotlin官网教程很不详细,其实不然,kotlin中文网教程很详细。 回到正题: 什么是?...异步编程 体验 语言级 理念 注意上面几个关键点和一些实际使用,不难明白 Kotlin是基于Kotlin语法从而延伸的一个异步编程框架,它并没有带来多少性能上的体验,它能实现的,你用线程池同样也可以实现...,但对于使用角度的来说,努力打造一个 "同步方式,异步编程的" 思想,作为开发者来说,我们可以更懒了,切换线程,withContext即可,带来了开发上的舒适,但这种舒适是基于 Kotlin 的语法...所以我希望大家刚入手时,多从语言角度去理解。 那么,是什么? 就是一个基于Kotlin语法的异步框架,它可以使开发者以同步的方式,写成异步的代码,而无需关注多余操作。...观察上面的打印日志,我们不难发现,在调用 delay 函数时,线程并没有停下,相对来说,只是我们的代码块被挂起,等待恢复。只有前面的挂起函数执行结束,我们的代码块才能继续执行。

54710

Kotlin系列(一)

一.的定义   最近看了一本有关kotlin的书籍,对又有了不一样的了解,所以准备写一个关于kotlin系列的文章。   ...三.Kotlin的基础设施   Kotlin实现分为两个层次: 基础设施层:标准库的API,主要对提供了概念和语义上最基本的支持 业务框架层:的上层框架支持,也就是在基础设施层的基础上再封装一层...  为了便于区分,我们将Kotlin的基础设施层创建的称为简单,将基于业务框架层创建的称为复合,这一小节主要来讨论简单的使用。...(4)函数的挂起   我们已经知道使用suspend关键字可以声明一个挂起函数,挂起函数只能在体内或其他挂起函数中调用。这样一来,整个kotlin语言体系就可以分为两派:普通函数和挂起函数。...(6)的拦截器   我们现在已经知道Kotlin可以通过调用挂起函数实现挂起,可以通过Continuation的恢复调用实现恢复,还知道可以通过绑定一个上下文来设置一些数据来丰富的能力,

19310

kotlin--入门

更像是一个管理者的秘书,它让我们从复杂的逻辑中得到解放,只需要告诉秘书执行流程,其他的都交由秘书安排 以上就是我对的理解,接下来来学习如何使用kotlin 一、实现异步任务相同功能 如果说我们有一个耗时操作...,的代码很容易理解,就是等待耗时任务返回结果,然后将结果设置到TextView上 的核心就是函数或一段程序能够被挂起,稍后再在挂起的位置恢复。...和resume suspend:也称为挂起或暂停,用于暂停执行当前,并保存所有局部变量 resume:用于让已暂停的从其暂停出继续执行 1.挂起函数 使用suspend关键字修饰的函数叫做挂起函数...挂起函数只能在体内或其他挂起函数内调用 挂起主要是和阻塞进行对比,挂起函数调用时并不会阻塞当前线程 挂起: class MainActivity : AppCompatActivity() {...三、调度器 所有的必须运行在调度器中,也就是我们之前代码指定的Dispatchers,即使在主线程也是如此 官方提供的调度器为以下三种: 调度器 四、的两部分 kotlin实现分为两个层次

57110

Kotlin(一)——入门

介绍 这里一开始不打算介绍什么是,虽然标题叫介绍~~ 为了方便理解,这边先做个比喻: 从使用的角度来看,Kotlin像是“另一种RxJava”,但是比RxJava要高效。...于是我决定一开始先不说什么是。 作用 上面说到,用起来“像是另一种RxJava”。 那么是不是可以用来开启一个异步操作?切换线程? 答案是肯定的,不仅可以做到,而且写起来也很简单。...使用 知道到了他的优(niu)秀(bi)之处,下面来看看是怎么用的 因为是Kotlin,所以项目需要支持Kotlin。怎么支持就不用我说了吧? (不要问我,我不会,因为那是另一个同事做的。...额~~ 用处大了,往下看 suspend suspend:申明这是个可挂起的函数,里面可以用的一下方法(launch()、async()、withContext()等)。...总结 基本的使用到这里就可以告一段落了,主要介绍了给我带来了什么,可以在什么场景下用,怎么用。相信这样同步的方式来写异步,这样写出来的代码一定是非常直观、清晰的。 然而,有关什么是

1.3K20
领券