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

破解 Kotlin 协程 番外篇(1) - 协程为什么被称为『轻量级线程』?

更有意思是,查阅资料过程,你会经常会陷入一种一会儿『啊,我懂了』,一会儿『啊,我懂个屁』循环当中,瞒各位说,我从七八年前刚开始学 Lua 时候面对 Lua 协程也是这个破感觉,后来接触...JavaScript 无论是跑 Web 还是 Node.js 当中,都是单线程玩耍Kotlin Native 虽然可以调用 pthread,但官方表示我们有自己并发模型(Worker),建议直接使用线程...,线程在上下文切换时候需要 CPU 把高速缓存清掉并从内存替换下一个线程内存数据,并且处理上一个内存中断点保存就是一个开销很大事儿。...但 NIO 就不一样了,IO 阻塞,通过开一个或很少几个线程来 select IO 事件,有 IO 事件到达时再分配相应线程去读写 IO,比起传统 IO 就已经有了很大提升。 欸?...,但如果我们协程来承载任务,极少量线程来承载协程,那么锁优化就变得简单了:协程如果无法获取到锁,那么协程挂起,对应线程就可以让出去运行其他协程了。

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

Kotlin 协程真的比 Java 线程更高效吗?

那么Kotlin-JVM协程有没有类似的锁实现呢?...例如我们IDEA中新建Kotlin工程时候。 可以看出来,这里是有选项,上述验证,我们只验证了 Kotlin-JVM 是不支持协程。那么有没有一种Kotlin-x 东西是支持协程呢?...标记 但是并没有 withContext 指定挂起, * 所以是没办法实现切线程作用,自然而然也就无法实现 所谓挂起了 * 个人理解这个suspend关键字作用就是提醒 调用者注意...很多人都会被所谓Kotlin协程阻塞式吓到,其实你就理解成Kotlin中所宣传阻塞式,无非是阻塞写法来完成阻塞任务而已。...Kotlin-JVM协程最大价值是写起来比RxJava线程切换还要方便。几乎就是阻塞写法来完成阻塞任务。

2K20

使用协程和 Flow 简化 API 设计

检查现有协程适配器 您为现有 API 编写自己封装之前,请检查是否已经存在针对您适配器或者 扩展方法。下面是一些包含常见类型协程适配器库。...执行完成而阻塞线程 suspend fun ListenableFuture.await(): T 使用这些函数,您可以摆脱回调并挂起协程直到 future 结果被返回。...同时,由于没有简单传播方式,错误处理也更加复杂。 Kotlin ,您可以简单地使用协程调用回调,但前提是您必须创建您自己适配器。...这里会挂起协程 //直到某个回调调用了 continuation 参数 } 注意: 尽管协程库同样包含了不可取消版本协程构建器 (即 suspendCoroutine),但最好始终选择使用...请参阅这篇: Kotlin Vocabulary | 揭秘协程 suspend 修饰符。

1.6K20

使用kotlin协程提高app性能(译)

协程是一种并发设计模式,您可以Android上使用它来简化异步执行代码。Kotlin1.3版本添加了 Coroutines,并基于其他语言既定概念。...要在主线程之外运行代码,您可以告诉Kotlin协程Default或IO调度程序上执行工作。Kotlin,所有协同程序必须在调度程序运行,即使它们主线程上运行。...某些情况下Kotlin协程可能会在暂停和恢复后将执行移动到另一个线程。 这意味着线程局部变量可能不会指向整个withContext()块相同值。...这些丢弃异常不会出现在崩溃指标,也不会出现在logcat。 并行分解 当函数返回时,必须停止由挂起函数启动所有协同程序,因此您可能需要保证这些协程返回之前完成。...此外,coroutineScope捕获协程抛出任何异常并将它们路由回调用者。 有关并行分解更多信息,请参阅编写挂起函数。

2.3K10

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

关键词:Kotlin 协程 协程挂起 任务挂起 suspend 阻塞 协程挂起最初是一个很神秘东西,因为我们总是线程概念去思考,所以我们只能想到阻塞。阻塞挂起到底是怎么回事呢?...: ① 处,我们 Kotlin 当中看到 resumeWith 参数类型是 Result,怎么这儿成了 Object 了?...因为 Result 是内联类,编译时会用它唯一成员替换掉它,因此就替换成了 Object (Kotlin 里面是 Any?)...Kotlin 下面的调用已经很接近了: suspend fun main() { log(hello()) } 只不过我们 Kotlin 当中还是不太容易拿到 hello 挂起真正返回值...协程体执行就是一个状态机,每一次遇到挂起函数,都是一次状态转移,就像我们前面例子 label 不断自增来实现状态流转一样 如果能够把这两点认识清楚,那么相信你在学习协程其他概念时候就都将不再是问题了

1.1K30

基本概念1 同步和异步2 阻塞和阻塞3 5.死锁(Deadlock),饥饿(Starvation)和活锁(Livelock)

1 同步和异步 同步和异步关注是消息通信机制 所谓同步,就是发出一个调用时,没有得到结果之前,该调用就不返回。就是由调用者主动等待这个调用结果。...2 阻塞和阻塞 通常用来形容多线程之间相互影响.比如一个线程占用了临界区资源,那么其他所有需要这个资源线程就必须在这个临界区进行等待,导致线程挂起,这就是阻塞....阻塞与之相反,强调没有一个线程可以妨碍其他线程执行,所有线程都会尝试不断地前向执行. 3 5.死锁(Deadlock),饥饿(Starvation)和活锁(Livelock) 死锁,饥饿,活锁都属于多线程情况下线程活跃性问题...死锁是指两个或两个以上进程执行过程,由于竞争资源或者由于彼此通信而造成一种阻塞现象,若无外力作用,它们都将无法推进下去。..."谦让"原则,主动将资源释放给他人使用,导致资源不断多个线程跳动,没有一个线程可以同时拿到所有的资源而正常执行.

1.2K70

Kotlin 协程总结

不过,我们学习 Kotlin 协程,一开始确实可以从线程控制角度来切入。因为 Kotlin ,协程一个典型使用场景就是线程控制。...就像 Java Executor 和 Android AsyncTask,Kotlin 协程也有对 Thread API 封装,让我们可以写代码时,不用关注多线程就能够很方便地写出并发操作...我们所使用「核心库」和 「平台库」版本应该保持一致。 核心库包含代码主要是协程公共 API 部分。有了这一层公共代码,才使得协程各个平台上接口得到统一。...suspend 是有暂停意思,但我们协程应该理解为:当线程执行到协程 suspend 函数时候,暂时继续执行协程代码了。...阻塞阻塞,都是针对单线程讲,一旦切了线程,肯定是非阻塞,你都跑到别的线程了,之前线程就自由了,可以继续做别的事情了。 所以「阻塞式挂起」,其实就是讲协程挂起同时切线程这件事情。

2.5K11

Kotlin 负责人:我们是如何一步步设计 Kotlin

Kotlin 独特之处在于:它多年来一直以例和社区驱动方式发展,早在 2016 年发布 1.0 稳定版本之前就开始了,即使是 2011 年上市之前也有一段时间了。...针对所有这些极端情况进行设计是非常耗时,并且缺少这些极端情况实际情况下,设计往往会变得不可能。关于这点,Kotlin 做法很务实。...例如,当 Kotlin 协程 Kotlin 1.3 变得稳定时,它们引入了一个新函数类——挂起函数和相应挂起函数类型。然而,不允许将挂起函数类型用作超类型。...这是后来 Kotlin 1.6 添加,因为协程使用变得越来越多,并且对实现此特性交互需求也越来越多(请参阅 KT-18707 支持将挂起函数作为超类型)。...版本编译器和 IDE 实现警告和自动代码修复情况是存在,这样受该更改影响开发人员将会有足够时间版本编译器发布之前提前替换代码(新版本编译器会对这段代码进行不同处理。)

1.2K20

JetBrains首席语言设计师:我们将如何让Kotlin再活几十年

Kotlin 独特之处在于:它多年来一直以例和社区驱动方式发展,早在 2016 年发布 1.0 稳定版本之前就开始了,甚至 2011 年上市之前一段时间也是如此。...针对所有这些极端情况进行设计是非常耗时,并且缺少这些极端情况实际情况下,设计往往会变得不可能。关于这点,Kotlin 做法很务实。...例如,当 Kotlin 协程 Kotlin 1.3 变得稳定时,它们引入了一个新函数类——挂起函数和相应挂起函数类型。然而,不允许将挂起函数类型用作超类型。...这是后来 Kotlin 1.6 添加,因为协程使用变得越来越多,并且对实现此特性交互需求也越来越多(请参阅 KT-18707 支持将挂起函数作为超类型)。...版本编译器和 IDE 实现警告和自动代码修复情况是存在,这样受该更改影响开发人员将会有足够时间版本编译器发布之前提前替换代码(新版本编译器会对这段代码进行不同处理。)

1.5K10

写给Android工程师协程指南

ps:本篇文章B站也有视频版本,结合观看,体验更佳,Android Kotlin 协程分享。...我回答: 一个 Kotlin 上以 同步方式写异步代码 线程框架,底层是使用了 线程池+状态机 概念,诸如此类,巴拉巴拉。 面试官: 那它到底和线程池有啥区别,我为啥直接线程池呢?...协作式指的是 多个任务共享CPU时间 ,并且没有主动释放CPU情况下,任务不会被强制中断。相应协作式多任务处理,任务需要自己决定何时放弃CPU,否则将影响其他任务执行。... Kotlin1.6 之前,协程版本通常与 kotlin 版本作为对应,但是 1.6 之后,协程版本就没有怎么更新了(目前最新是1.7.0-beta),反而是 Kotlin 版本目前最新已经 1.8.10...传统原生异常处理,我们处理异常无在乎是这两种: tryCatch(); Thread.setDefaultUncaughtExceptionHandler(); 后者常用于主线程保底,前者用于几乎任何位置

1.3K40

Kotlin Vocabulary | 揭秘协程 suspend 修饰符

了解这些将会帮您更好地理解挂起函数 (suspend function) 为什么只会在所有工作完成后才会返回,以及如何在阻塞线程情况下挂起代码。...正如官方文档《利用 Kotlin 协程提升应用性能》所介绍,我们可以使用协程管理那些以往可能阻塞主线程或者让应用卡死异步任务。 协程也可以帮我们用命令式代码替换那些基于回调 API。...这种实现可以使函数可能情况下同步返回。...使用不同 Dispatcher 您可以不同 Dispatcher 间切换,从而做到不同线程执行计算。那么 Kotlin 是如何知道从哪里开始恢复挂起计算呢?...这些声明由版本为 1.3.3 协程库生成,可能会在其未来版本作出修改。

2.2K10

Kotlin协程解析系列(上):协程调度与挂起

图片 2.2.2 launch launch是最常用用于启动协程方式,会在阻塞当前线程情况下启动一个协程,并返回对该协程任务引用,即Job对象。...图片 图片 协程需要运行在协程上下文环境协程环境launch有两种:GlobalScope 与 CoroutineScope 。...图片 图片 注意: await() 不能在协程之外调用,因为它需要挂起直到计算完成,而且只有协程可以以阻塞方式挂起。所以把它放到协程。...确保所有的协程都会被追踪,Kotlin 不允许没有使用CoroutineScope情况下启动新协程。...挂起函数只能在协程或另一个挂起函数中被调用,如果你协程中使用到了挂起函数,会报错。

1.7K40

干货 | KotlinNative 异步并发模型初探

Kotlin/JVM 协程既能完成异步请求,也能完成并行计算,并且由于协程拥有挂起(suspend),Kotlin/JVM 就可以协程而非线程层面上来解决并发竞争问题。...注意,本文基于 Kotlin 1.3.61,Kotlin/Native 作为一个实验性项目,任何版本变动都有可能造成 API 破坏性变更。...Kotlin/Native 对跨线程/Worker 访问对象拥有严格限制,因此对象一定维度上又分为两种状态,即 Freeze(冻结)与 Unfreeze(冻结)。...主分支版本协程上,程序无法引用到 newSingleThreadContext() 函数,它曾经是 Kotlin/JVM独有的,但当前 Kotlin/Native 预览版多线程协程,newSingleThreadContext...Mutex 存在 bug,一旦两个协程发生事实上 Mutex 锁竞争,Mutex 就会将协程一直挂起恢复,这会导致我们永远看不到输出结果,如果将上面的代码剔除掉与 Native 有关部分(例如对象子图分离

1.6K20

Kotlin 学习笔记(四)—— 协程基础知识,面试官最爱了~

它并不局限于任何语言,不仅 Kotlin 中有对协程实现,Python、Go 等语言也有。 更实际一点,协程代码是运行在线程,可以单线程执行;也可以多线程执行,即支持来回切换。...suspend 关键字本身没有挂起作用,需要在方法内部直接或者间接地调用 Kotlin 协程框架 suspend 函数才可以。...所以,suspend 关键字更多是给调用者一个提示,提示调用者被它修饰方法是个耗时方法,需要在协程或者其他 suspend 函数处理,限制这个方法只能在协程或其他 suspend 函数中被调用。...,推荐 Android 开发中使用,因为它生命周期是与Application 应用一致,所以容易造成内存泄漏。...,它可以阻塞性挂起当前线程,并且设置时间间隔之后恢复执行,是可被取消

1.4K30

网络编程 同步,阻塞,异步,阻塞之区别

网络编程之同步,阻塞,异步,阻塞 同步:函数没有执行完返回,线程被挂起 阻塞:没有收完数据函数返回,线程也被挂起 异步:函数立即返回,通过事件或是信号通知调用者 阻塞:函数立即返回,通过select...如果执行部 件状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低(有些初学多线程编程的人,总喜欢一个循环去检查某个变量值,这其实是一种很严重 错误)。...如果主窗口和调用函数同一个线程,除非你特殊界面操 作函数调用,其实主界面还是应该可以刷新。socket接收数据另外一个函数recv则是一个阻塞调用例子。...当socket工作阻塞模式时候, 如果没有数据情况下调用该函数,则当前线程就会被挂起,直到有数据为止。...这两种情况下阻塞发送使用允许发送者提前于接收者进行,以便在两进程速度方面,计算更容忍波动。   缓存和准备好模式阻塞发送有一个更有限影响。

29320

View 上使用挂起函数

Kotlin 协程 让我们可以同步代码来建立异步问题模型。这是非常好特性,但是目前大部分用例都专注于 I/O 任务或是并发操作。...挂起函数 (Suspending functions) 是协程基础组成部分,它允许我们以阻塞方式编写代码。...suspendCancellableCoroutine Kotlin 协程库,有很多协程构造器方法,这些构造器方法内部可以使用挂起函数来封装回调 API。...并不是所有的操作都有已取消或出错状态,但是这些操作有。就像后面 Animator 示例那样,我们必须把这些状态传递到协程,让调用者可以处理错误状态。...作用域 不知道您有没有发现这样一个问题,在上面的例子,我们使用了 lifecycleScope 来启动协程,为什么要这样做呢?

2.3K30

同步、异步与阻塞、阻塞

换句话说,就是由【调用者】主动等待这个【调用】结果。   而异步正好相反,【调用】发出之后,这个调用就直接返回了,所以没有返回结果。...也就是说,当一个异步过程调用发出后,调用者不会立刻得到结果   而是【调用】发出后,【被调用者】通过状态、通知来通知调用者,或通过回调函数处理这个调用。   ...异步:执行一个操作之后,可以去执行其他操作,然后等待通知再回来执行刚才没执行完操作。 1. 阻塞与阻塞   阻塞和阻塞关注是程序等待调用结果(消息,返回值)时状态。   ...阻塞调用是指调用结果返回之前,当前线程会被挂起,调用线程只有得到结果之后才会返回。   阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。   ...还是上面的例子:   你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞调用,你会一直把自己挂起,直到得到这本书有没有的结果,如果是非阻塞调用   你不管老板有没有告诉你,你自己先一边去玩了,当然你也要偶尔过几分钟

2.1K20

CPS(Continuation-Passing-Style, 续体传递风格)

Java API ,Thread 类是实现线程最基本类,每创建一个 Thread 对象,就代表着操作系统内核启动了一个线程,如果我们阅读 Thread 类源码,可以发现,它内部实现是大量...其次,线程并非是一种轻量级资源,大量创建线程是对系统资源一种消耗,而传统阻塞调用会导致系统存在大量因阻塞而运行线程,这对系统资源是一种极大浪费。...通过这样设计,开发者可以极大提高线程使用率,用尽量少线程执行尽量多任务,其次调用者无需在编程时思考过多资源浪费问题,可以每当有异步或并发需求时候就不假思索开启协程。...,Kotlin 没有联合类型概念,貌似也没有加入这种语法计划,所以只好用最泛化类型 Any?...挂起函数编译,每个挂起函数都会被编译为一个实现了 Continuation 接口匿名类,而续体拦截器会拦截真正挂起协程挂起续体。

2.3K30

《Kotin 极简教程》第9章 轻量级线程:协程(2)《Kotlin极简教程》正式上架:

挂起时,对应协程状态与局部变量等一起被存储在编译器生成字段恢复该协程时,恢复局部变量并且状态机从挂起点接着后面的状态往后执行。...9.15.2 标准 API 协程有三个主要组成部分: 语言支持(即如上所述挂起功能), Kotlin 标准库底层核心 API, 可以直接在用户代码中使用高级 API。...基于 JDK 7 及更高版本 API 阻塞 IO(NIO):kotlinx-coroutines-nio 支持 Swing (kotlinx-coroutines-swing) 和 JavaFx...我们看到协程通过挂起机制实现阻塞特性大大提升了我们并发性能。 最后,我们还简单介绍了协程实现原理以及标准API库。Kotlin协程实现大量地调用了Java多线程API。...所以Kotlin,我们仍然完全可以使用Java多线程编程。 下一章我们来一起学习Kotlin与Java代码之间互相调用。

1.2K20
领券