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

Kotlin-特殊的阻塞

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

2.3K20

Kotlin 总结

不过,我们学习 Kotlin 中的,一开始确实可以从线程控制的角度来切入。因为在 Kotlin 中,的一个典型的使用场景就是线程控制。...而恢复这个功能是的,如果你不在里面调用,恢复这个功能没法实现,所以也就回答了这个问题:为什么挂起函数必须在或者另一个挂起函数里被调用。...因为 一个挂起函数要么在里被调用,要么在另一个挂起函数里被调用,所以不管是直接还是间接地,总是会在一个里被调用的。...所以我们想要自己写一个挂起函数,仅仅只加上 suspend 关键字是不行的,还需要函数内部直接或间接地调用Kotlin 框架自带的 suspend 函数才行。 3.suspend 的意义?...因为你这个函数实质上并没有发生挂起,那你这个 suspend 关键字只有一个效果:就是限制这个函数只能在里被调用,如果在非的代码中调用,就会编译不通过。

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

Kotlin开篇

Kotlin》均基于Kotlinx-coroutines 1.3.70 新开个坑,专门讲kotlin。聊程之前先说一下具体聊的是的什么内容。 · 是什么? · 什么时候用?...· 的核心是什么? · kotlin和其他语言的有什么异同? kotlin的出现其实比kotlin语言还晚一点。在当前这个版本,甚至都还处于一个不稳定的迭代版本中。...存活 } 上面的代码是一个常规启动的方式,关键函数只有 launch,delay,这两个函数是kotlin独有的。...这个问题涉及到Kotlin的Scope,调度,也是的实现核心逻辑 Kotlin不是第一个提出的 实际上在Kotlin之前就有不少语言实践了这个概念。比如python,golang。...kotlin还在发展 如果去看kotlin源码的话会发现里面有很多 exeprimental 的api和实现逻辑。

87020

破解 Kotlin (2) - 启动篇

JVM 上默认调度器的实现也许你已经猜到,没错,就是开了一个线程池,但区区几个线程足以调度成千上万个,而且每一个都有自己的调用栈,这与纯粹的开线程池去执行异步任务有本质的区别。...就是需要它的运行结果的时候, launch 调用后会返回一个 Job 实例,对于这种情况,我们可以: 调用 Job.start,主动触发的调度执行 调用 Job.join,隐式的触发的调度执行...那么调用 cancel 的时机不同,结果也是有差异的,例如调度之前、开始调度但尚未执行、已经开始执行、执行完毕等等。...cancel 就已经调用,那么就会直接被 cancel 而不会有任何调用,当然也有可能开始时尚未被 cancel,那么它就可以正常启动了。...需要注意的是,cancel 调用一定会将该 job 的状态置为 cancelling,只不过 ATOMIC 模式的在启动时无视了这一状态。

96030

破解 Kotlin (5) - 取消篇

关键词:Kotlin 取消 任务停止 的任务的取消需要靠内部调用的协作支持,这就类似于我们线程中断以及对中断状态的响应一样。 1. 线程的中断 我们先从大家熟悉的话题讲起。...,OkHttp 在收到我们的取消指令之后,也确实停止了网络请求,并且回调给我们一个 IO 异常,这时候我们的已经被取消,在处于取消状态的调用 Continuation.resume 、 Continuation.resumeWithException...再谈 Retrofit 的扩展 4.1 Jake Wharton 的 Adapter 存在的问题 我在破解 Kotlin - 入门篇(https://www.bennyhuo.com/2019...实际上如果网络请求被取消,这个回调确实会被调到,那么由于取消的操作是的由 Continuation 的取消发起的,因此这时候没必要再调用 continuation.resumeWithException...接着我们将之前我们一直提到的回调转的例子进一步升级,支持取消,这样大家就可以轻易的将回调转变为的挂起调用了。

1.7K50

破解 Kotlin (6) - 挂起篇

关键词:Kotlin 挂起 任务挂起 suspend 非阻塞 的挂起最初是一个很神秘的东西,因为我们总是用线程的概念去思考,所以我们只能想到阻塞。不阻塞的挂起到底是怎么回事呢?...Kotlin 下面的调用已经很接近了: suspend fun main() { log(hello()) } 只不过我们在 Kotlin 当中还是不太容易拿到 hello 在挂起时的真正返回值...调用完全一样。...就是 Kotlin 编译之后产生的字节码。...当然,这一篇内容的安排更多是为后面的序列篇开路,Kotlin 的 Sequence 就是基于实现的,它的用法很简单,几乎与普通的 Iterable 没什么区别,因此序列篇我们会重点关注它的内部实现原理

1.1K30

破解 Kotlin (3) - 调度篇

关键词:Kotlin 异步编程 上一篇我们知道了启动的几种模式,也通过示例认识了 launch 启动的使用方法,本文将延续这些内容从调度的角度来进一步为大家揭示的奥义。 ? 1...., dispatch 方法会在拦截器的方法 interceptContinuation 中调用,进而实现的调度。...这里又有大家没见过的内容啦, suspendCoroutine 这个方法并不是帮我们启动的,它运行在当中并且帮我们获取到当前的 Continuation 实例,也就是拿到回调,方便后面我们调用它的...Kotlin 设计者也特别害怕大家注意不到这一点,还特地废弃了两个 API 并且开了一个 issue 说我们要重做这套 API,这两个可怜的家伙是谁呢?...通过这个例子我们可以知道,实际上启动一个只需要有一个 lambda 表达式就可以了,想当年 Kotlin 1.1 刚发布的时候,我写了一系列的教程都是以标准库 API 为基础的,后来发现标准库的 API

73020

Kotlin系列(二)

在进行业务开发时,我们通常会基于官方的框架(kotlinx.coroutines)来运用Kotlin优化异步逻辑,不过这个框架过于庞大和复杂,如果直接接触它容易被劝退。...的描述类,官方给出的名字是Job,和线程的描述类Thread相比,Job同样有join函数,调用时会挂起,直到它的完成,它的cancel函数可以对应Thread的interrupt函数,用于取消协...} } }   调度的具体过程其实就是在delegate的恢复调用之前,通过dispatch将其调度在指定的调度器上。...它会将的执行切换到主线程,以确保 UI 操作不会在后台线程上执行 IO调度器(Dispatchers.IO):专门用于执行涉及阻塞 IO 操作的,例如文件读写或网络请求。...IO 调度器使用一个专门的线程池,允许执行大量的 IO 操作而不阻塞线程 无限制调度器(Dispatchers.Unconfined):允许调用挂起函数的线程中继续执行,直到第一个挂起点。

22310

【翻译】深入 Kotlin

【翻译】深入 Kotlin 2017-10-26 by Liuqingwen | Tags: Kotlin 翻译 | Hits ? 一、前言 翻译好的文章也是一种学习方法!...原文作者:Adrian Bukros 二、正文 编写 Kotlin 相关的文章是当下比较流行的一个话题,这当然是有极好的理由支撑着的。...调用 Job 类的 join() 方法将暂停它所包含的的运行。 async{} 通过使用 async 函数你可以达到和 launch 一样的效果,唯一一个非常重要的差别是:它有返回值。...线程 vs 唤醒一个线程需要巨大的资源开销。在一个现代化系统上,一个线程非常容易就能吃掉 1M 多的内存。在当前的上下文中,我们可以通过调用(根据文档)来作为“轻量级”的线程。...在那种特定上下文的情形下,调用一个可以保证与 UI 相关连的代码(比如设置标签的文本)都能在 UI 线程中被调用。 第二个参数 start 是指明何时应该开始执行。

1.4K10

Kotlin | 是什么?

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

55010

Kotlin系列(一)

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

19510

kotlin--入门

到目前为止没有一个具体的定义,但很多语言都有,但每个语言又有所不同,官方说基于线程,是轻量级的线程。在我看来,是一种趋势,它让我们从繁琐的多线程中释放出来,提高我们的编写代码的效率。...更像是一个管理者的秘书,它让我们从复杂的逻辑中得到解放,只需要告诉秘书执行流程,其他的都交由秘书安排 以上就是我对的理解,接下来来学习如何使用kotlin 一、实现异步任务相同功能 如果说我们有一个耗时操作...挂起函数只能在体内或其他挂起函数内调用 挂起主要是和阻塞进行对比,挂起函数调用时并不会阻塞当前线程 挂起: class MainActivity : AppCompatActivity() {...,也就是我们之前代码指定的Dispatchers,即使在主线程也是如此 官方提供的调度器为以下三种: 调度器 四、的两部分 kotlin实现分为两个层次,我们之前使用的都是业务框架层 1...,是不过业务框架层已经做了封装 五、结构化并发 当某个协任务丢失,无法追踪,会导致资源浪费,甚至发送一个无用的网络请求,这种情况称为任务泄漏 为了解决任务泄漏,kotlin引入了结构化并发机制 使用结构化并发可以做到

57110

Kotlin(一)——入门

介绍 这里一开始不打算介绍什么是,虽然标题叫介绍~~ 为了方便理解,这边先做个比喻: 从使用的角度来看,Kotlin像是“另一种RxJava”,但是比RxJava要高效。...使用 知道到了他的优(niu)秀(bi)之处,下面来看看是怎么用的 因为是Kotlin,所以项目需要支持Kotlin。怎么支持就不用我说了吧? (不要问我,我不会,因为那是另一个同事做的。...mainScop = MainScope() 注意记得在销毁的时候调用cancel(),调用cancel()后用mainScope启动的都会取消掉。...withContext withContext():用给定的上下文调用指定的暂停块,暂停直到完成,然后返回结果。也就是说,可以用来切换线程,并返回执行后的结果。...由于Deferred#await()需要在调用,所以上面在launch()中使用async()。 “这有什么用?跟launch()差不多啊?”

1.3K20

笔记 | 初探Kotlin

如何理解 是一种不同于进程和线程的存在,其本质是一种函数,同一线程中的多个协是串行执行的,但为了理解仍然需要三者一起对比。...info: 我认为关于的全部,最佳参考为Google官方编写的文章: 谷歌开发者:在 Android 开发中使用 | 背景介绍 在安卓开发中使用 Kotlin 1.3版本中开始引入了一种全新处理并发的方式...在 Kotlin 中,所有都必须在调度器中运行,即使它们是在主线程上运行也是如此。suspend并不代表后台执行,在哪里执行由调度器决定。可以自行暂停,而调度器负责将其恢复。...调用suspend函数 调用UI函数 更新LiveData Dispatchers.IO 非主线程 专为磁盘和网络IO进行了优化 数据库 文件读写 网络处理 Dispatchers.Default 非主线程...CoroutineScope 会跟踪它使用 launch 或 async 创建的所有。您可以随时调用 scope.cancel() 以取消正在进行的工作(即正在运行的)。

52620

Kotlin系列(三)

1.前言   前面两节,我们运用了kotlin提供的简单去实现了一套更易用的复合,这些基本上是以官方框架为范本进行设计和实现的。...虽然我们还没有直接接触kotlin官方框架,但对它的绝大多数功能已经了如指掌了。...本节,我们来探讨一下官方框架的更多功能,并将其运用到实际的生产当中,在这里,我以在Android中使用kotlin官方框架为例进行讲述。...LAZY:只有被需要时,包括主动调用start,join,await等函数时才会开始调度,如果调度前被取消协就会进入异常结束状态 UNDISPATCHED:创建之后立即在当前函数的调用栈中执行...通过上面的测试,我们可以得出结论,launch函数和async函数启动的是并行执行的,并且启动程之后会立马往下执行,不会等待完成,除非调用join或await函数。

22510

Kotlin 底层实现 ① ( Kotlin 分层架构 | 基础设施层 | 业务框架层 | 使用 Kotlin 基础设施层标准库 Api 实现 )

文章目录 一、Kotlin 分层架构 二、使用 Kotlin 基础设施层标准库 Api 实现 一、Kotlin 分层架构 ---- Kotlin 分层架构 : 在 Kotlin 中..., 分为两层 ; 基础设施层 : Kotlin 提供了 标准库 Api , 为提供 概念 , 语义 支持 , 是 实现的基础 ; Kotlin 的底层支持 ; 基础 Api ;...包下 ; import kotlin.coroutines.* 业务框架层 : 如果调用 常见的 Api , 调用的是 业务框架层 的 Api , 如 GlobalScope , launch ,...基础设施层标准库 Api 实现 ---- 需要使用 体定义 , 体格式如下 : suspend { // 体内容 } 体定义完之后 , 调用体的 createCoroutine...: 上述 基础设施层 的 基础 Api 定义在 kotlin.coroutines.* 包下 ; import kotlin.coroutines.* 业务框架层 : 如果调用 常见的 Api

77110
领券