阻塞协程是种特殊的协程启动方式,一般是用 runBlocking{} 扩起来一段协程。...首先是父协程得到执行,然后才是子协程。 重点是这两段协程都在同一个线程main里完成。这里就带来一个有趣的问题, runBLocking{}和平时常用的launch有什么区别?...这里给出结果,改用GlobalScope.launch之后,子协程会在一个独立的线程里运行。 runBlocking 在kotlin协程官网上对于这个api的解释是桥接阻塞与非阻塞的世界。...在创建完coroutine后就进入派发流程了,这部分和Kotlin协程-一个协程的生命周期中的逻辑比较相似,下面也会讲到。...这个问说明,runBLocking{}这种协程,它的运行逻辑是先把父协程放队列里,然后取出来执行,执行完毕再把子协程入队,再出队子协程,用同样的方式递归。
协程设计的初衷是为了解决并发问题,让 「协作式多任务」 实现起来更加方便。 协程就是 Kotlin 提供的一套线程封装的 API,但并不是说协程就是为线程而生的。...不过,我们学习 Kotlin 中的协程,一开始确实可以从线程控制的角度来切入。因为在 Kotlin 中,协程的一个典型的使用场景就是线程控制。...c.suspend suspend是 Kotlin 协程最核心的关键字,几乎所有介绍 Kotlin 协程的文章和演讲都会提到它。它的中文意思是「暂停」或者「可挂起」。...所以这个 suspend,其实并不是起到把任何把协程挂起,或者说切换线程的作用。 真正挂起协程这件事,是 Kotlin 的协程框架帮我们做的。...4,Kotlin 协程 的实战 5,漫画:什么是协程? 向大佬们致敬。
《Kotlin协程》均基于Kotlinx-coroutines 1.3.70 新开个坑,专门讲kotlin的协程。聊协程之前先说一下具体聊的是协程的什么内容。 · 协程是什么? · 什么时候用协程?...· 协程的核心是什么? · kotlin的协程和其他语言的协程有什么异同? kotlin的协程的出现其实比kotlin语言还晚一点。在当前这个版本,协程甚至都还处于一个不稳定的迭代版本中。...存活 } 上面的代码是一个常规启动协程的方式,关键函数只有 launch,delay,这两个函数是kotlin协程独有的。...这个问题涉及到Kotlin协程的Scope,调度,也是协程的实现核心逻辑 Kotlin不是第一个提出协程的 实际上在Kotlin之前就有不少语言实践了协程这个概念。比如python,golang。...kotlin的协程还在发展 如果去看kotlin的协程源码的话会发现里面有很多 exeprimental 的api和实现逻辑。
我们今天主要说 Kotlin。...我们说过,启动协程需要三样东西,分别是 上下文、启动模式、协程体,协程体 就好比 Thread.run 当中的代码,自不必说。 本文将为大家详细介绍 启动模式。...在 Kotlin 协程当中,启动模式是一个枚举: public enum class CoroutineStart { DEFAULT, LAZY, @ExperimentalCoroutinesApi...在 Nodejs 中,Kotlin 协程的默认调度器则并没有实现线程的切换,输出结果也会略有不同,这样似乎更符合 JavaScript 的执行逻辑。 更多调度器的话题,我们后续还会进一步讨论。...我们在前面提到我们的示例都运行在 suspend main 函数当中,所以 suspend main 函数会帮我们直接启动一个协程,而我们示例的协程都是它的子协程,所以这里 5 的调度取决于这个最外层的协程的调度规则了
搞清楚内部概念对分析协程源码来说非常关键。 协程的最小粒度-Coroutine 对没接触过协程的人来说,一个OOP代码的最小调度粒度是函数。...在协程中,最小的调度粒度是协程,在kotlin中叫coroutine。...Unconfined: CoroutineDispatcher } 它提供了几个默认的派发逻辑,比如Default会在默认线程池中随机执行coroutine,Main会在主线程,比如Android中的UI...为什么可以提升效率,在Kotlin协程-协程设计的基础中有具体解释。...协程框架三大件,Continuation-Disptacher-Scheduler Kotlin的协程从框架设计上就考虑了跨平台的问题。 这里的跨平台不是指安卓和服务端。
实现这个能力的关键在于协程实现了continuation接口。...从协程源码里猜测,它肯定是一个实现了continuation的类,因此它才能有可重入性。...把编译后的字节码用jd-gui打开可以看到,我们所写的协程会给编译器插入代码,实现SuspendLambda接类, ?...但这个函数又再次是 kotlin 标准库里的。...所以会看到虽然协程的外部概念很清晰,只是一个 coroutine,但在协程内部,实际上支撑它的还有Continuation,Dispatch,Intercept。还是挺复杂的。
关键词:Kotlin 协程 协程取消 任务停止 协程的任务的取消需要靠协程内部调用的协作支持,这就类似于我们线程中断以及对中断状态的响应一样。 1. 线程的中断 我们先从大家熟悉的话题讲起。...再谈 Retrofit 的协程扩展 4.1 Jake Wharton 的 Adapter 存在的问题 我在破解 Kotlin 协程 - 入门篇(https://www.bennyhuo.com/2019...,Android 中 MainScope就是一个调度到 UI 线程的 supervisorScope; coroutineScope 的逻辑则是父子相互取消的逻辑;而 GlobalScope 会启动一个全新的作用域...父协程。 4.2 如何正确的将回调转换为协程 前面我们提到既然 adapt 方法不是 suspend 方法,那么我们是不是应该在其他位置创建协程呢?...最后我们还分析了一下 Retrofit 的协程扩展的一些问题和解决方法,这个例子也进一步可以引发我们对协程作用域以及如何将现有程序协程化的思考。
关键词:Kotlin 异步编程 协程 上一篇我们知道了协程启动的几种模式,也通过示例认识了 launch 启动协程的使用方法,本文将延续这些内容从调度的角度来进一步为大家揭示协程的奥义。 ? 1....Main 主要用于 UI 相关程序,在 Jvm 上包括 Swing、JavaFx、Android,可将协程调度到各自的 UI 线程上。...Js 本身就是单线程的事件循环,与 Jvm 上的 UI 程序比较类似。 3.2 编写 UI 相关程序 Kotlin 的用户绝大多数都是 Android 开发者,大家对 UI 的开发需求还是比较大的。...这里我们用到了 Dispatchers.Main 来确保 launch 启动的协程在调度时始终调度到 UI 线程,那么下面我们来看看 Dispatchers.Main 的具体实现。...Kotlin 协程设计者也特别害怕大家注意不到这一点,还特地废弃了两个 API 并且开了一个 issue 说我们要重做这套 API,这两个可怜的家伙是谁呢?
关键词:Kotlin 协程 协程挂起 任务挂起 suspend 非阻塞 协程的挂起最初是一个很神秘的东西,因为我们总是用线程的概念去思考,所以我们只能想到阻塞。不阻塞的挂起到底是怎么回事呢?...协程调用完全一样。...就是 Kotlin 协程编译之后产生的字节码。...当然,字节码是比较抽象的,我这样写出来就是为了让大家更容易的理解协程是如何执行的,看到这里,相信大家对于协程的本质有了进一步的认识: 协程的挂起函数本质上就是一个回调,回调类型就是 Continuation...当然,这一篇内容的安排更多是为后面的序列篇开路,Kotlin 的 Sequence 就是基于协程实现的,它的用法很简单,几乎与普通的 Iterable 没什么区别,因此序列篇我们会重点关注它的内部实现原理
在进行业务开发时,我们通常会基于官方的协程框架(kotlinx.coroutines)来运用Kotlin协程优化异步逻辑,不过这个框架过于庞大和复杂,如果直接接触它容易被劝退。...但不适合执行可能导致线程阻塞的操作 主线程调度器(Dispatchers.Main):适用于 Android 应用程序中执行 UI 操作的协程。...它会将协程的执行切换到主线程,以确保 UI 操作不会在后台线程上执行 IO调度器(Dispatchers.IO):专门用于执行涉及阻塞 IO 操作的协程,例如文件读写或网络请求。...该作用域包括以下三种: 顶级作用域:没有父协程的协程所在的作用域为顶级作用域 协同作用域:协程中启动新的协程,新协程为所在协程的子协程,这种情况下子协程所在的作用域默认为协同作用域。...主同作用域:与协程作用域在协程的父子关系上一致,区别在于处于该作用域下的协程出现未捕获的异常时不会将异常向上传递给父协程。
所以请打开Kotlin中文网。很多人说kotlin官网教程很不详细,其实不然,kotlin中文网教程很详细。 回到正题: 什么是协程?...异步编程 体验 语言级 理念 注意上面几个关键点和一些实际使用,不难明白 Kotlin协程是基于Kotlin语法从而延伸的一个异步编程框架,它并没有带来多少性能上的体验,它能实现的,你用线程池同样也可以实现...,但对于使用角度的来说,协程努力打造一个 "同步方式,异步编程的" 思想,作为开发者来说,我们可以更懒了,切换线程,withContext即可,协程带来了开发上的舒适,但这种舒适是基于 Kotlin 的语法...所以我希望大家刚入手协程时,多从语言角度去理解。 那么,协程是什么? 协程就是一个基于Kotlin语法的异步框架,它可以使开发者以同步的方式,写成异步的代码,而无需关注多余操作。...就这么简单 协程怎么用?
一.协程的定义 最近看了一本有关kotlin协程的书籍,对协程又有了不一样的了解,所以准备写一个关于kotlin协程系列的文章。 ...三.Kotlin协程的基础设施 Kotlin的协程实现分为两个层次: 基础设施层:标准库的协程API,主要对协程提供了概念和语义上最基本的支持 业务框架层:协程的上层框架支持,也就是在基础设施层的基础上再封装一层... 为了便于区分,我们将Kotlin协程的基础设施层创建的协程称为简单协程,将基于业务框架层创建的协程称为复合协程,这一小节主要来讨论简单协程的使用。...,用来处理未捕获的异常 协程的标准库也为我们定义了一个空的协程上下文,EmptyCoroutineContext,里面没有任何数据。...(6)协程的拦截器 我们现在已经知道Kotlin协程可以通过调用挂起函数实现挂起,可以通过Continuation的恢复调用实现恢复,还知道协程可以通过绑定一个上下文来设置一些数据来丰富协程的能力,
它启动了一个单独的协程与其它所有的协程一起并发的工作。...请注意,使用协程进行并发总是显式的。 惰性启动的 async 可选的,async 可以通过将 start 参数设置为 CoroutineStart.LAZY 而变为惰性的。...在这个模式下,只有结果通过 await 获取的时候协程才会启动,或者在 Job 的 start函数调用的时候。...注意,如果我们只是在 println 中调用 await,而没有在单独的协程中调用 start,这将会导致顺序行为,直到 await 启动该协程 执行并等待至它结束,这并不是惰性的预期用例。...在 Kotlin 的协程中使用这种风格是强烈不推荐的, 原因如下所述。
【翻译】深入 Kotlin 协程 2017-10-26 by Liuqingwen | Tags: Kotlin 翻译 | Hits ? 一、前言 翻译好的文章也是一种学习方法!...原文作者:Adrian Bukros 二、正文 编写 Kotlin 协程相关的文章是当下比较流行的一个话题,这当然是有极好的理由支撑着的。...解决方案 3 : Coroutines 协程 这是我们使用协程来实现的代码的模样: button.setOnClickListener { launch(UI){ val userString...在 C# 5.0 中,追溯到 2012 年,关于异步函数微软提出了一个特性,非常类似 Kotlin 中的协程: public async Task doWork() { // do some...在那种特定上下文的情形下,调用一个协程可以保证与 UI 相关连的代码(比如设置标签的文本)都能在 UI 线程中被调用。 第二个参数 start 是指明协程何时应该开始执行。
协程到目前为止没有一个具体的定义,但很多语言都有协程,但每个语言又有所不同,官方说协程基于线程,是轻量级的线程。在我看来,协程是一种趋势,它让我们从繁琐的多线程中释放出来,提高我们的编写代码的效率。...协程更像是一个管理者的秘书,它让我们从复杂的逻辑中得到解放,只需要告诉秘书执行流程,其他的都交由秘书安排 以上就是我对协程的理解,接下来来学习如何使用kotlin的协程 一、实现异步任务相同功能 如果说我们有一个耗时操作...,并且完成后更新ui界面,我们以前会考虑使用异步任务,我这里模拟了一个耗时操作,点击TextView,然后开启一个异步任务,最后更新ui class MainActivity : AppCompatActivity...接下来是协程的写法: 首先需要gradle里添加下协程的依赖 dependencies { //依赖协程核心库 ,提供Android UI调度器 implementation "org.jetbrains.kotlinx...三、调度器 所有的协程必须运行在调度器中,也就是我们之前代码指定的Dispatchers,即使在主线程也是如此 官方提供的调度器为以下三种: 调度器 四、协程的两部分 kotlin的协程实现分为两个层次
介绍 这里一开始不打算介绍什么是协程,虽然标题叫介绍~~ 为了方便理解,这边先做个比喻: 从使用的角度来看,Kotlin的协程像是“另一种RxJava”,但是比RxJava要高效。...这里先有个大致的印象,先了解下协程在实际中的作用,回头再去看它的原理,或许会更容易些。 一开始查了好多关于协程资料(包括官方完档),发现不同的人说的不大一样,最后越看越乱。...于是我决定一开始先不说什么是协程。 作用 上面说到,协程用起来“像是另一种RxJava”。 那么是不是可以用协程来开启一个异步操作?切换线程? 答案是肯定的,不仅可以做到,而且写起来也很简单。...使用 知道到了他的优(niu)秀(bi)之处,下面来看看是怎么用的 因为是Kotlin的协程,所以项目需要支持Kotlin。怎么支持就不用我说了吧? (不要问我,我不会,因为那是另一个同事做的。...总结 协程基本的使用到这里就可以告一段落了,主要介绍了协程给我带来了什么,可以在什么场景下用,怎么用。相信这样同步的方式来写异步,这样写出来的代码一定是非常直观、清晰的。 然而,有关什么是协程?
一、什么是协程 说明:仅限于 JVM和Android上,协程就是一个类似安卓handler和java中线程池的一种线程框架,协程只是对线程高级封装的API,协程的本质还是线程——协程=漂亮的多线程。...挂起函数必须要带suspend修饰,但不是说被suspend修饰的函数就是线程切换的点,而是这个挂起函数有直接或间接的调用kotlin协程内自带的挂起函数来实现挂起,从而才实现线程的切换;suspend...修饰只是提醒kotlin这一块是一个耗时操作,避免卡顿。...2.这里有别于一个协程内创建多个子协程去挂起,协程内的单个子协程挂起了会去执行其他子协程,务必不要搞混了。withContext挂起的是内部包裹的代码块,阻塞当前运行withContext的协程。...6、Flow流:是冷流,就是 Kotlin 协程与响应式编程模型结合的产物,你会发现它与 RxJava 非常像,用于替代RxJava。
如何理解协程 协程是一种不同于进程和线程的存在,其本质是一种函数,同一线程中的多个协程是串行执行的,但为了理解仍然需要三者一起对比。...进程、线程、协程三者的上下文切换对比: 进程 线程 协程 切换者 操作系统 操作系统 用户(编程者/应用程序) 切换时机 根据操作系统自己的切换策略,用户不感知 根据操作系统自己的切换策略,用户不感知...info: 我认为关于协程的全部,最佳参考为Google官方编写的文章: 谷歌开发者:在 Android 开发中使用协程 | 背景介绍 在安卓开发中使用协程 Kotlin 1.3版本中开始引入了一种全新处理并发的方式...在 Kotlin 中,所有协程都必须在调度器中运行,即使它们是在主线程上运行也是如此。suspend并不代表后台执行,在哪里执行由调度器决定。协程可以自行暂停,而调度器负责将其恢复。...Kotlin提供了以下三种调度器并罗列了其使用场景: 调度器名称 运行线程 使用场景 适用案例1 适用案例2 适用案例3 Dispatchers.Main Android上的主线程 用来处理UI交互和一些轻量级任务
1.前言 前面两节,我们运用了kotlin提供的简单协程去实现了一套更易用的复合协程,这些基本上是以官方协程框架为范本进行设计和实现的。...虽然我们还没有直接接触kotlin官方协程框架,但对它的绝大多数功能已经了如指掌了。...本节,我们来探讨一下官方协程框架的更多功能,并将其运用到实际的生产当中,在这里,我以在Android中使用kotlin官方协程框架为例进行讲述。...时又可以切换到UI线程上,非常的方便。...5.协程的超时取消 kotlin官方协程框架为我们提供了一个withTimeout()函数用于执行超时取消设置,这个api的定义如下: public suspend fun withTimeout
文章目录 一、Kotlin 协程分层架构 二、使用 Kotlin 协程基础设施层标准库 Api 实现协程 一、Kotlin 协程分层架构 ---- Kotlin 协程分层架构 : 在 Kotlin 中..., 协程分为两层 ; 基础设施层 : Kotlin 提供了 协程 标准库 Api , 为协程提供 概念 , 语义 支持 , 是 协程 实现的基础 ; Kotlin 协程的底层支持 ; 基础 Api ;...业务框架层 : Kotlin 协程的 上层框架 , 使用方便 ; 在之前博客中使用的 GlobalScope 类 , launch 函数 , delay 挂起函数 等都属于 业务框架层 , 都是 Kotlin...协程 的上层实现 ; 在 基础 Api 的基础上 进行了一层封装 , 形成了方便开发者使用的框架 ; 基础设施层 : 基础设施层 的 协程基础 Api 定义在 kotlin.coroutines.*...: 上述 基础设施层 的 协程基础 Api 定义在 kotlin.coroutines.* 包下 ; import kotlin.coroutines.* 业务框架层 : 如果调用 常见的协程 Api
领取专属 10元无门槛券
手把手带您无忧上云