但是我认为这种比喻不对,更好的解释是kotlin 的协程其实是 kotlin 线程池中的一个任务(Task);我们能执行协程操作,其实是因为调用了协程框架的接口,该协程框架是对线程池的进一步封装。...明白这一点后,你可能会问,为什么kotlin要重复造轮子,java线程池不好吗?kotlin协程相对于我们使用java线程池有什么优势吗?...为什么不直接使用Java线程池 这里需要提前说明一下,kotlin 协程封装的线程池与 java 的线程池是不一样的。...Job 结束运行 deferred.await() //阻塞等待直到获取协程的执行结果 前面我们提到过,kotlin 协程的一大特点就是结构化并发。...这就是 kotlin 协程中的结构化并发。 CoroutineName CoroutineName 用来表示协程的名称,一般用于调试或者打印日志。
一.协程的定义 最近看了一本有关kotlin协程的书籍,对协程又有了不一样的了解,所以准备写一个关于kotlin协程系列的文章。 ...言归正传,我们在学习一个新东西的时候,如果连这个东西"是什么"都回答不了,那么自然很难进入知识获取阶段的"为什么"和"怎么办"这两个后续环节了。因此,我们首先得知道协程的定义。 ...三.Kotlin协程的基础设施 Kotlin的协程实现分为两个层次: 基础设施层:标准库的协程API,主要对协程提供了概念和语义上最基本的支持 业务框架层:协程的上层框架支持,也就是在基础设施层的基础上再封装一层...如果我们为Receiver对应的类型增加一个RestrictsSuspension注解,那么在它的限制下,在协程体内就不能调用外部的挂起函数了,也就是说如果调用delay函数就会出错。...在回答这个问题之前我们先来了解一个概念:挂起点,在协程内部挂起函数的调用处被称为挂起点,只有当挂起点处发生异步调用,当前协程才会被挂起,直到这个协程对应的continuation实例的resumeWith
写在开始 大概在三年前,那时的我实习期间刚学会 Kotlin ,意气风发,协程Api 调用的也是炉火纯青,对外自称api调用渣渣工程师。 那时候的客户端还没这么饱和,也不像现在这样稳定。...记得后来去面试,有人问我,协程到底是什么? 我回答: 一个在 Kotlin 上以 同步方式写异步代码 的线程框架,底层是使用了 线程池+状态机 的概念,诸如此类,巴拉巴拉。...直到现在为止,我仍然没有认真去看过协程的底层实现,真是何其的尴尬,再次想起,仍觉不安。...相信不少同学在学习 Kotlin协程 的时候,常常会看到很多人(包括官网)会将线程与协程拉在一起比较,或者经常也能看见一些实验,比如同时启动10w个线程与10w个协程,然后从结果上看两者差距巨大,线程看起来性能巨差...同时启动10w线程和协程 在协程官网,我们大概都能看到这样一句话,同时启动10w和线程和协程等等。
很高兴,你终于追寻这个问题了,也许你正感到迷茫,各路大神对协程的理解不一,有人说它是线程框架,有人说它比线程更轻,希望我这篇博文可以帮你从另一个角度简单理解协程。...所以请打开Kotlin中文网。很多人说kotlin官网教程很不详细,其实不然,kotlin中文网教程很详细。 回到正题: 什么是协程?...所以我希望大家刚入手协程时,多从语言角度去理解。 那么,协程是什么? 协程就是一个基于Kotlin语法的异步框架,它可以使开发者以同步的方式,写成异步的代码,而无需关注多余操作。...观察上面的打印日志,我们不难发现,在调用 delay 函数时,线程并没有停下,相对来说,只是我们的协程代码块被挂起,等待恢复。只有前面的挂起函数执行结束,我们的协程代码块才能继续执行。...所谓的非阻塞,其实就是切换了线程,观察打印日志变化,我们可以发现,当我们直接 GlobalScope.launch 启动一个协程时,此时运行的线程为默认的线程,所以协程被称为非阻塞的实现方式。
从前面我们可以大致了解了协程的玩法,如果一个协程中使用子协程,那么该协程会等待子协程执行结束后才真正退出,而达到这种效果的原因就是协程上下文,上下文贯穿了协程的生命周期,这套思想和我们app的上下文很像...包括我自己),这些概念都是在上下文的基础上引申而来的,所以我一再强调它的重要性,协程的上下文必须理解透,才能玩好协程,接下来我们来真正了解协程上下文 一、协程上下文 1.CoroutineContext...(主线程的协程)中,手动调用jobA的join方法,那么主线程就会阻塞,直到jobA执行完毕。...,除了取消异常(CancellationException)外,当一个协程有了异常,如果没有主动捕获异常,那么异常会向上传播,直到根协程,子协程的异常都会导致根协程退出,自然其他子协程也会退出 例子1:...,出现异常后会开始取消协程,但是CPU密集型的代码还会执行,但是遇到挂起函数就会抛一个CancellationException,导致协程结束运行,如果我们在挂起函数加上try catch打印,那么我们就可以看到
今天我们继续来聊聊Kotlin的协程Coroutine。 如果你还没有接触过协程,推荐你先阅读这篇入门级文章What? 你还不知道Kotlin Coroutine?...Kotlin协程实现原理:Suspend&CoroutineContext Kotlin协程实现原理:CoroutineScope&Job 如果你已经接触过协程,相信你都有过以下几个疑问: 协程到底是个什么东西...下面我们继续看日志,发现withContext并没有拦截成功,这是为什么呢?注意看Dispatchers.Main。这也是接下来需要分析的内容。...如果需要则调用dispatch进行线程的切换,保证协程的正确运行。 如果我要自定义协程线程的切换逻辑,就可以通过继承于CoroutineDispatcher来实现,将它的核心方法进行自定义即可。...这也是为什么官方推荐使用withContext进行协程线程的切换的原因。
关键词:Kotlin 协程 协程挂起 任务挂起 suspend 非阻塞 协程的挂起最初是一个很神秘的东西,因为我们总是用线程的概念去思考,所以我们只能想到阻塞。不阻塞的挂起到底是怎么回事呢?..., 也就是我们看到的 cancellable.getResult() 的类型是 Any?,这是为什么?...,为了做到这一点,我们用 Java 来仿写一下这段逻辑: 注意,下面的代码逻辑上并不能做到十分严谨,不应该出现在生产当中,仅供学习理解协程使用。...那么我这段 Java 代码的编写根据是什么呢?就是 Kotlin 协程编译之后产生的字节码。...当然,字节码是比较抽象的,我这样写出来就是为了让大家更容易的理解协程是如何执行的,看到这里,相信大家对于协程的本质有了进一步的认识: 协程的挂起函数本质上就是一个回调,回调类型就是 Continuation
到这里,我们已经看到了下面这些启动协程的方式: launch(CommonPool) {...} async(CommonPool) {...} run(NonCancellable) {...}...send函数被挂起直到另外一个协程调用receive函数, 然后receive函数挂起直到另外一个协程调用send函数。它是一个完全无锁的实现。...关于协程工作原理的更多细节可以在这个设计文档中找到:https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md...本章小结 本章我通过大量实例学习了协程的用法;同时了解了作为轻量级线程的协程是怎样简化的我们的多线程并发编程的。我们看到协程通过挂起机制实现非阻塞的特性大大提升了我们并发性能。...最后,我们还简单介绍了协程的实现的原理以及标准API库。Kotlin的协程的实现大量地调用了Java中的多线程API。所以在Kotlin中,我们仍然完全可以使用Java中的多线程编程。
介绍 这里一开始不打算介绍什么是协程,虽然标题叫介绍~~ 为了方便理解,这边先做个比喻: 从使用的角度来看,Kotlin的协程像是“另一种RxJava”,但是比RxJava要高效。...于是我决定一开始先不说什么是协程。 作用 上面说到,协程用起来“像是另一种RxJava”。 那么是不是可以用协程来开启一个异步操作?切换线程? 答案是肯定的,不仅可以做到,而且写起来也很简单。...使用 知道到了他的优(niu)秀(bi)之处,下面来看看是怎么用的 因为是Kotlin的协程,所以项目需要支持Kotlin。怎么支持就不用我说了吧? (不要问我,我不会,因为那是另一个同事做的。...withContext withContext():用给定的协程上下文调用指定的暂停块,暂停直到完成,然后返回结果。也就是说,可以用来切换线程,并返回执行后的结果。...不同的是他可以返回协程执行结束后值。 async()返回的是一个Deferred对象,需要通过Deferred#await()得到返回值。
前言 上周在内部分享会上大佬同事分享了关于 Kotlin 协程的知识,之前有看过 Kotlin 协程的一些知识,以为自己还挺了解协程的,结果......Kotlin - 协程基础篇》 《抽丝剥茧Kotlin - 协程Flow篇》 目录 一、基础 1....GlobalScope:全局协程作用域,可以在整个应用的声明周期中操作,且不能取消,所以仍不适用于业务开发。 自定义作用域:自定义协程的作用域,不会造成内存泄漏。...除了简单的用法外,这里有两个问题得注意一下: collect 函数是一个 suspend 方法,所以它必须发生在协程或者带有 suspend 的方法里面,这也是我为什么在一开始的时候启动了 lifecycleScope.launch...我将会在下一篇文章中和大家讨论协程的原理,欢迎大家关注。 学习协程和 kotlin 还是很有必要的,我们团队在开发新的功能的时候,也全部选择了 Kotlin。
《Kotlin协程》均基于Kotlinx-coroutines 1.3.70 新开个坑,专门讲kotlin的协程。聊协程之前先说一下具体聊的是协程的什么内容。 · 协程是什么? · 什么时候用协程?...· 协程的核心是什么? · kotlin的协程和其他语言的协程有什么异同? kotlin的协程的出现其实比kotlin语言还晚一点。在当前这个版本,协程甚至都还处于一个不稳定的迭代版本中。...可以看到在打印World的时候,代码是运行在子线程的。 协程其实没那么容易 对于经常用协程开发的人来说,有几个很有意思的问题值得思考下。...虽然现在还可以在微软官网上找到关于纤程的资料,但能用好纤程的程序员凤毛麟角。 Using Fibers 直到golang的出现,才把协程这个技术发扬光大。...有人说python也有协程呀,为什么是golang。其实python的协程不是真正意义上的协程,后面我们会说到。
前言一定要看到最后 早就听说Go语言开发的服务不用任何架构优化,就可以轻松实现百万级别的qps。这得益于Go语言级别的协程的处理效率。...: " + stopWatch.prettyPrint()); } 耗时情况 协程完胜 可以看到上面的结果,在对比访问一个耗时1s的服务10000次时,协程只需要2秒多,而多线程模型需要4秒多,...而反观协程,基于固定的几个线程调度,可以轻松实现百万级的协程处理,而且内存稳稳的。 后记 最后,博主以为Quasar只是一个框架层面的东西,所以就又去看了下同样是jvm语言的kotlin的协程。...: " + stopWatch.prettyPrint()) } 当博主看到这个结果的时候,有种震惊的赶脚,kotlin的同步模型牛逼呀,瞬时感觉到发现了java里的骚操作了,可以使用kotlin的协程来代替...那为什么上面的测试结果差距这么大呢,是因为我错误的把协程实现里的阻塞等同于线程的阻塞。
Kotlin 的协程从 v1.1 开始公测(Experimental) 到现在,已经算是非常成熟了,但大家对它的看法却一直存在各种疑问,为什么呢?...它跟线程最大的区别在于线程一旦开始执行,从任务的角度来看,就不会被暂停,直到任务结束这个过程都是连续的,线程之间是抢占式的调度,因此也不存在协作问题。...Kotlin 协程确实在实现的过程中提供了切线程的能力,这是它的能力,不是它的身份,就好比拿着学位证非说这是身份证一样,学位证描述的是这人能干啥,不能描述这人是谁。...我更愿意把协程作为更贴近业务逻辑甚至人类思考层面的一种抽象,这个抽象层次其实已经比线程更高了。线程可以让我们的程序并发的跑,协程可以让并发程序跑得看起来更美好。 线程本身就可以,为什么要用协程呢?...这就像我们经常被人问起 Java 就可以解决问题,我为什么要用 Kotlin 呢?为什么你说呢? 6. 小结 ?
对 Jetpack Compose 感兴趣的同学可以看一下我的另一个笔记系列—— Jetpack Compose 学习笔记。这次咱来看看 Kotlin 协程的基础知识。 1....当挂起函数结束后程序恢复运行时,这时执行协程的线程就是执行挂起函数的线程。即挂起函数由哪个线程执行,后续协程就在哪个线程执行。...这也是为什么我们可以在协程中用写同步代码的思想,去写异步的逻辑。...可以用于数据打点,log 日志记录等,更像是一个守护线程。这个 Scope 是属于标准协程库中的。...今天我把它的皮给扒了 https://rengwuxian.com/kotlin-coroutines-2/ ;Hugo(谢晨成) Kotlin 协程:简单理解 runBlocking, launch
其中比较典型的有Scheme、Lua、Python、Perl、Go等以first-class的方式提供对协程的支持。 同样地,Kotlin也支持协程。...挂起函数只能从协程代码内部调用,普通的非协程的代码不能调用。...Hello, 另外, 我们不能使用Thread来启动协程代码。...这是为什么?...所以我们可以得出结论:运行 main () 函数的主线程, 必须要等到我们的协程完成之前结束 , 否则我们的程序在 打印Hello, 1和Hello, 2之前就直接结束掉了。
Kotlin Flow 是基于 Kotlin 协程基础能力搭建的一套数据流框架,从功能复杂性上看是介于 LiveData 和 RxJava 之间的解决方案。...并且在 Kotlin 协程的加持下,Kotlin Flow 目前是 Google 主推的数据流框架。 1. 为什么要使用 Flow?...,并保持数据流直到在最后一个订阅者注销时结束(或直到 scope 指定的作用域结束)。...可以看到,这些协程 API 只有在最后组件 / 视图销毁时才会取消协程,当视图进入后台时协程并不会被取消,Flow 会持续生产数据,并且会触发更新视图。...可以看到,这些协程 API 在视图离开某个状态时会挂起协程,能够避免更新视图。但是 Flow 会持续生产数据,也会产生一些不必要的操作和资源消耗(CPU 和内存)。
我们在了解协程的并发与调度的时候涉及到了Job。Kotlin 协程 组合挂起函数和async关键字,实现协程的并发操作 (zinyan.com) 这篇继续深入了解Job。...isActive println(s) } //输出 true 说明我当前的协程对象是活动的。 而为什么要添加“?” 那是因为对象可能为null。...协程:0 结束 协程:1 结束 协程:2 结束 所有的协程结束 我们可以看到,父协程的代码已经执行完毕并输出了。...给协程命名-方便进行调试 协程如果打印日志的时候,是会有默认Id的。但是如果是在处理一些特定的请求或者逻辑的话 我们给协程进行命名,那我们在调试的时候就能更方便的进行调试了。...这种命名结果只有在log日志中才能看到结果。 初始协程时,多元素添加 我们学过载协程中初始化调度器,在上一步也学习了添加协程名称。
b.开始使用 协程最简单的使用方法,其实在前面章节就已经看到了。...如果只是使用 launch 函数,协程并不能比线程做更多的事。不过协程中却有一个很实用的函数:withContext 。...函数的创建者对函数的使用者的提醒:我是一个耗时函数,我被我的创建者用挂起的方式放在后台运行,所以请在协程里调用我。...为什么 suspend关键字并没有实际去操作挂起,但 Kotlin 却把它提供出来? 因为它本来就不是用来操作挂起的。...很可能因为你看过的教程都是错的 2,Kotlin 协程的挂起好神奇好难懂?今天我把它的皮给扒了 3,到底什么是「非阻塞式」挂起?协程真的更轻量级吗?
面试官:你知道协程吗? 你:订机票的那个吗,我常用。 面试官:行,你先回去吧,到时候电话联系 。。。。。。。。...为什么我会说到协程,这个很多java程序员都没用过的东西。第一、吸引眼球! ? 好了,言归正传。...为什么这么说,因为我们假如业务线程池设置的最大线程数是1000,那么在核心线程数处理不过来的时候,就会不断的新增线程数直到1000,这样系统中就会出现大量的上下文切换而导致性能损耗。...其实在go,以及kotlin中,早已原生支持了协程的概念,所以go以及kotlin的ITer会相对javaer更多的了解协程。 此时javaer欲哭无泪啊。 但是我们真的就不能用协程了吗?...好了,说了这么多,其实就是一句话,目前现成的像样点的纯种协程框架就只有quasar,混种的就用kotlin吧。至于quasar,会在后续文章中继续介绍。
关键词:协程 分类 所谓知己知彼,百战不殆。为了搞清楚 Kotlin 协程是怎么回事,我们也来看看其他语言的协程是怎么实现的。...Kotlin 的协程是一种无栈协程的实现,它的控制流转依靠对协程体本身编译生成的状态机的状态流转来实现,变量保存也是通过闭包语法来实现的,不过 Kotlin 的协程可以在任意调用层次挂起,换句话说我们启动一个...Lua 的协程也有几个状态,挂起(suspended)、运行(running)、结束(dead)。...其中,调用 yield 之后的协程处于挂起态,获得执行权而正在运行的协程则是处于运行态,协程对应的函数运行结束后,则处于结束态。...,某种意义上已经超越了协程概念的讨论范围,因此也有很多人认为 go routine 不能简单的认为就是协程。
领取专属 10元无门槛券
手把手带您无忧上云