首页
学习
活动
专区
圈层
工具
发布

Kotlin协程-特殊的阻塞协程

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

2.8K20

Kotlin 协程总结

协程设计的初衷是为了解决并发问题,让 「协作式多任务」 实现起来更加方便。 协程就是 Kotlin 提供的一套线程封装的 API,但并不是说协程就是为线程而生的。...不过,我们学习 Kotlin 中的协程,一开始确实可以从线程控制的角度来切入。因为在 Kotlin 中,协程的一个典型的使用场景就是线程控制。...c.suspend suspend是 Kotlin 协程最核心的关键字,几乎所有介绍 Kotlin 协程的文章和演讲都会提到它。它的中文意思是「暂停」或者「可挂起」。...所以这个 suspend,其实并不是起到把任何把协程挂起,或者说切换线程的作用。 真正挂起协程这件事,是 Kotlin 的协程框架帮我们做的。...4,Kotlin 协程 的实战 5,漫画:什么是协程? 向大佬们致敬。

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

    Kotlin协程开篇

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

    1.2K20

    破解 Kotlin 协程(5) - 协程取消篇

    关键词: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 的协程扩展的一些问题和解决方法,这个例子也进一步可以引发我们对协程作用域以及如何将现有程序协程化的思考。

    2.2K50

    破解 Kotlin 协程(2) - 协程启动篇

    我们今天主要说 Kotlin。...我们说过,启动协程需要三样东西,分别是 上下文、启动模式、协程体,协程体 就好比 Thread.run 当中的代码,自不必说。 本文将为大家详细介绍 启动模式。...在 Kotlin 协程当中,启动模式是一个枚举: public enum class CoroutineStart { DEFAULT, LAZY, @ExperimentalCoroutinesApi...在 Nodejs 中,Kotlin 协程的默认调度器则并没有实现线程的切换,输出结果也会略有不同,这样似乎更符合 JavaScript 的执行逻辑。 更多调度器的话题,我们后续还会进一步讨论。...我们在前面提到我们的示例都运行在 suspend main 函数当中,所以 suspend main 函数会帮我们直接启动一个协程,而我们示例的协程都是它的子协程,所以这里 5 的调度取决于这个最外层的协程的调度规则了

    1.3K30

    破解 Kotlin 协程(3) - 协程调度篇

    关键词: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,这两个可怜的家伙是谁呢?

    97320

    破解 Kotlin 协程(6) - 协程挂起篇

    关键词:Kotlin 协程 协程挂起 任务挂起 suspend 非阻塞 协程的挂起最初是一个很神秘的东西,因为我们总是用线程的概念去思考,所以我们只能想到阻塞。不阻塞的挂起到底是怎么回事呢?...协程调用完全一样。...就是 Kotlin 协程编译之后产生的字节码。...当然,字节码是比较抽象的,我这样写出来就是为了让大家更容易的理解协程是如何执行的,看到这里,相信大家对于协程的本质有了进一步的认识: 协程的挂起函数本质上就是一个回调,回调类型就是 Continuation...当然,这一篇内容的安排更多是为后面的序列篇开路,Kotlin 的 Sequence 就是基于协程实现的,它的用法很简单,几乎与普通的 Iterable 没什么区别,因此序列篇我们会重点关注它的内部实现原理

    1.5K30

    【翻译】深入 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 是指明协程何时应该开始执行。

    1.7K10

    Kotlin协程系列(二)

    在进行业务开发时,我们通常会基于官方的协程框架(kotlinx.coroutines)来运用Kotlin协程优化异步逻辑,不过这个框架过于庞大和复杂,如果直接接触它容易被劝退。...但不适合执行可能导致线程阻塞的操作 主线程调度器(Dispatchers.Main):适用于 Android 应用程序中执行 UI 操作的协程。...它会将协程的执行切换到主线程,以确保 UI 操作不会在后台线程上执行 IO调度器(Dispatchers.IO):专门用于执行涉及阻塞 IO 操作的协程,例如文件读写或网络请求。...该作用域包括以下三种: 顶级作用域:没有父协程的协程所在的作用域为顶级作用域 协同作用域:协程中启动新的协程,新协程为所在协程的子协程,这种情况下子协程所在的作用域默认为协同作用域。...主同作用域:与协程作用域在协程的父子关系上一致,区别在于处于该作用域下的协程出现未捕获的异常时不会将异常向上传递给父协程。

    51210

    Kotlin协程系列(一)

    一.协程的定义   最近看了一本有关kotlin协程的书籍,对协程又有了不一样的了解,所以准备写一个关于kotlin协程系列的文章。   ...三.Kotlin协程的基础设施   Kotlin的协程实现分为两个层次: 基础设施层:标准库的协程API,主要对协程提供了概念和语义上最基本的支持 业务框架层:协程的上层框架支持,也就是在基础设施层的基础上再封装一层...  为了便于区分,我们将Kotlin协程的基础设施层创建的协程称为简单协程,将基于业务框架层创建的协程称为复合协程,这一小节主要来讨论简单协程的使用。...,用来处理未捕获的异常   协程的标准库也为我们定义了一个空的协程上下文,EmptyCoroutineContext,里面没有任何数据。...(6)协程的拦截器   我们现在已经知道Kotlin协程可以通过调用挂起函数实现挂起,可以通过Continuation的恢复调用实现恢复,还知道协程可以通过绑定一个上下文来设置一些数据来丰富协程的能力,

    45110

    Kotlin | 协程是什么?

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

    82710

    kotlin--协程入门

    协程到目前为止没有一个具体的定义,但很多语言都有协程,但每个语言又有所不同,官方说协程基于线程,是轻量级的线程。在我看来,协程是一种趋势,它让我们从繁琐的多线程中释放出来,提高我们的编写代码的效率。...协程更像是一个管理者的秘书,它让我们从复杂的逻辑中得到解放,只需要告诉秘书执行流程,其他的都交由秘书安排 以上就是我对协程的理解,接下来来学习如何使用kotlin的协程 一、实现异步任务相同功能 如果说我们有一个耗时操作...,并且完成后更新ui界面,我们以前会考虑使用异步任务,我这里模拟了一个耗时操作,点击TextView,然后开启一个异步任务,最后更新ui class MainActivity : AppCompatActivity...接下来是协程的写法: 首先需要gradle里添加下协程的依赖 dependencies { //依赖协程核心库 ,提供Android UI调度器 implementation "org.jetbrains.kotlinx...三、调度器 所有的协程必须运行在调度器中,也就是我们之前代码指定的Dispatchers,即使在主线程也是如此 官方提供的调度器为以下三种: 调度器 四、协程的两部分 kotlin的协程实现分为两个层次

    83310

    【Kotlin】协程(一)——入门

    介绍 这里一开始不打算介绍什么是协程,虽然标题叫介绍~~ 为了方便理解,这边先做个比喻: 从使用的角度来看,Kotlin的协程像是“另一种RxJava”,但是比RxJava要高效。...这里先有个大致的印象,先了解下协程在实际中的作用,回头再去看它的原理,或许会更容易些。 一开始查了好多关于协程资料(包括官方完档),发现不同的人说的不大一样,最后越看越乱。...于是我决定一开始先不说什么是协程。 作用 上面说到,协程用起来“像是另一种RxJava”。 那么是不是可以用协程来开启一个异步操作?切换线程? 答案是肯定的,不仅可以做到,而且写起来也很简单。...使用 知道到了他的优(niu)秀(bi)之处,下面来看看是怎么用的 因为是Kotlin的协程,所以项目需要支持Kotlin。怎么支持就不用我说了吧? (不要问我,我不会,因为那是另一个同事做的。...总结 协程基本的使用到这里就可以告一段落了,主要介绍了协程给我带来了什么,可以在什么场景下用,怎么用。相信这样同步的方式来写异步,这样写出来的代码一定是非常直观、清晰的。 然而,有关什么是协程?

    1.6K20

    Kotlin协程知识累计

    一、什么是协程 说明:仅限于 JVM和Android上,协程就是一个类似安卓handler和java中线程池的一种线程框架,协程只是对线程高级封装的API,协程的本质还是线程——协程=漂亮的多线程。...挂起函数必须要带suspend修饰,但不是说被suspend修饰的函数就是线程切换的点,而是这个挂起函数有直接或间接的调用kotlin协程内自带的挂起函数来实现挂起,从而才实现线程的切换;suspend...修饰只是提醒kotlin这一块是一个耗时操作,避免卡顿。...2.这里有别于一个协程内创建多个子协程去挂起,协程内的单个子协程挂起了会去执行其他子协程,务必不要搞混了。withContext挂起的是内部包裹的代码块,阻塞当前运行withContext的协程。...6、Flow流:是冷流,就是 Kotlin 协程与响应式编程模型结合的产物,你会发现它与 RxJava 非常像,用于替代RxJava。

    53310

    笔记 | 初探Kotlin协程

    如何理解协程 协程是一种不同于进程和线程的存在,其本质是一种函数,同一线程中的多个协程是串行执行的,但为了理解仍然需要三者一起对比。...进程、线程、协程三者的上下文切换对比: 进程 线程 协程 切换者 操作系统 操作系统 用户(编程者/应用程序) 切换时机 根据操作系统自己的切换策略,用户不感知 根据操作系统自己的切换策略,用户不感知...info: 我认为关于协程的全部,最佳参考为Google官方编写的文章: 谷歌开发者:在 Android 开发中使用协程 | 背景介绍 在安卓开发中使用协程 Kotlin 1.3版本中开始引入了一种全新处理并发的方式...在 Kotlin 中,所有协程都必须在调度器中运行,即使它们是在主线程上运行也是如此。suspend并不代表后台执行,在哪里执行由调度器决定。协程可以自行暂停,而调度器负责将其恢复。...Kotlin提供了以下三种调度器并罗列了其使用场景: 调度器名称 运行线程 使用场景 适用案例1 适用案例2 适用案例3 Dispatchers.Main Android上的主线程 用来处理UI交互和一些轻量级任务

    82120

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

    文章目录 一、SupervisorJob 协程 二、supervisorScope 协程作用域构建器函数 在上一篇博客介绍了 协程异常处理 【Kotlin 协程】协程异常处理 ① ( 根协程异常处理...| 自动传播异常 | 在协程体捕获异常 | 向用户暴露异常 | 在 await 处捕获异常 | 非根协程异常处理 | 异常传播特性 ) , 其中介绍了 协程中异常的传播特性 : 协程 运行时 , 产生异常..., 会将异常 传递给 父协程 , 父协程会执行如下操作 : ① 取消子协程 : 不仅仅取消产生异常的子协程 , 该父协程下所有的子协程都会取消 ; ② 取消父协程 : 将父协程本身取消 ; ③ 向父协程的父协程传播异常...: 继续将异常传播给 父协程的父协程 ; 这样就会导致 某个子协程一旦出现异常 , 则 兄弟协程 , 父协程 , 父协程的兄弟协程 , 父协程的父协程 等等 都会被取消 , 这样牵连太大 , 因此本篇博客中引入几种异常处理机制解决上述问题...; 一、SupervisorJob 协程 ---- SupervisorJob 协程 执行时如果 该类型的 子协程 出现异常 , 不会将 异常传递给 父协程 , 因此也不会影响到 父协程 下的 其它子协程

    1.1K10
    领券