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

Kotlin 多路复用技术 ② ( select 函数原型 | SelectClauseN 事件 | 查看挂起函数是否支持 select )

一、select 函数原型 ---- 在上一篇博客 【Kotlin 多路复用技术 ① ( 多路复用技术 | await 多路复用 | Channel 通道多路复用 ) , 介绍了...多路复用技术 , 多路复用 主要使用 select 代码块 实现 , 在 select 代码块 调用多个协 onAwait 函数 , 哪个协先返回数据 , 就选择该数据作为返回值 ;...调用者被挂起,直到其中一个子句 * _selected_或_fails_。 * * 最多一个子句被*原子地*选中,并且它块被执行。所选子句结果 * 成为选择结果。...如果有任何子句_fails_,则选择调用将生成 * 相应异常。在本例没有选择子句。 * * 这个选择函数_biased_到第一个子句。当可以同时选择多个子句时, * 第一个有优先权。...相反,每个可选择挂起函数都具有 * 对应挂起版本,可以与常规“when”表达式一起使用来选择一个 * 选项,如果没有选项可以立即选择,则执行默认(' else ')操作。

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

《Kotin 极简教程》第9章 轻量级线程:(1)

launch函数它以阻塞(non-blocking)当前线程方式,启动一个后台任务,并返回一个Job类型对象作为当前引用。...另外,这里delay()函数类似Thread.sleep()功能,但更好:它不会阻塞线程,而只是挂起本身。...Thread.sleep(5000L) } 9.2 桥接 阻塞阻塞 上面的例子,我们给出使用阻塞delay函数,同时有使用了阻塞Thread.sleep函数,这样代码写在一起可读性不是那么地好...让我们来使用纯Kotlin代码来实现上面的 阻塞+阻塞 例子(不用Thread)。...该runBlocking函数不是用来当做普通函数使用,它设计主要是用来桥接普通阻塞代码和挂起风格(suspending style)阻塞代码, 例如用在 main 函数,或者用于测试用例代码

1.1K10

Kotlin | 是什么?

异步编程 体验 语言级 理念 注意上面几个关键点和一些实际使用,不难明白 Kotlin基于Kotlin语法从而延伸一个异步编程框架,它并没有带来多少性能上体验,它能实现,你用线程池同样也可以实现...,但对于使用角度来说,努力打造一个 "同步方式,异步编程" 思想,作为开发者来说,我们可以更懒了,切换线程,withContext即可,带来了开发上舒适,但这种舒适基于 Kotlin 语法...那上面注释 挂起 是什么意思呢? 什么挂起? 观察上面的打印日志,我们不难发现,在调用 delay 函数时,线程并没有停下,相对来说,只是我们代码块被挂起,等待恢复。...只有前面的挂起函数执行结束,我们代码块才能继续执行。借用一幅图来说明如下: 所以所谓挂起其实是代码层次一个处理,从而使得我们可以以同步形式去写异步代码。 阻塞程序?...所谓阻塞,其实就是切换了线程,观察打印日志变化,我们可以发现,当我们直接 GlobalScope.launch 启动一个时,此时运行线程为默认线程,所以被称为阻塞实现方式。

54710

Kotlin知识累计

注意: 1.单内多 suspend 函数运行:suspend 函数挂起,挂起当前suspend 函数所在一个多个suspend 挂起函数顺序执行,上面的suspend函数没执行完不会执行其他...一个withContext和一个delay都是可以实现挂起,withContext挂起时间取决于包裹代码块运行时间,delay直接设置挂起时间,delay挂起阻塞当前运行delaydelay...4.runBlocking {}会等待所有子执行完毕 2、阻塞式挂起:就是用阻塞代码写法,实现了阻塞功能(同步代码写法实现异步任务) runBlocking本身会阻塞当前线程去等待...不同之处在于 launch 返回一个 Job 并且不附带任何结果值,而 async 返回一个 Deferred 包裹值—— >一个轻量级阻塞。...从源码可知folw内执行了挂起函数,flow库,只能用于环境。

16210

kotlin 入门教程

但是我认为这种比喻不对,更好解释kotlin 其实是 kotlin 线程池中一个任务(Task);我们能执行操作,其实是因为调用了框架接口,该框架对线程池进一步封装。...大概原理如下图所示: 可以看到,Java线程池实现是通过阻塞队列存储任务,然后线程不断地执行任务;而 kotlin 线程池,则是线程存储任务,kotlin线程池负责调度任务。...runBlocking 则是一个顶层方法,它可以获取执行结果,但这种方式会阻塞代码执行流程,因此只建议在测试中使用。上面的代码示例使用 launch 来创建。...CoroutineContext 上下文。不同于 Android Context,CoroutineContext 功能更像一个 Map,它内部包含多种类型元素。...至于为什么提供挂起函数,像delay,可以自动响应取消呢?

13210

Kotlin Coroutines 笔记 (一)

安静妹子.jpg 一. Kotlin 在1.1版本之后引入了概念,目前它还是一个试验API。 在操作系统,我们知道进程和线程概念以及区别。...Kotlin 阻塞异步编程方式。Kotlin 允许我们使用来代替复杂线程阻塞操作,并且复用原本线程资源。 Kotlin 依靠编译器实现, 并不需要操作系统和硬件支持。...常用基本概念 2.1 CoroutineContext 上下文,它包含了一个默认调度器。所有都必须在 CoroutineContext 执行。...我们使用 suspend 关键字来修饰可以被挂起函数。被标记为 suspend 函数只能运行在或者其他 suspend 函数。...} delay(2000) } runBlocking 创建直接运行在当前线程上,同时阻塞当前线程直到结束。

91420

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

所以,suspend 关键字更多给调用者一个提示,提示调用者被它修饰方法个耗时方法,需要在或者其他 suspend 函数处理,限制这个方法只能在或其他 suspend 函数中被调用。...3.4 作用域 launch 函数第三个参数一个由外层 CoroutineScope 调用 lambda 闭包,我们需要在处理逻辑都在这个闭包实现。...而 launch 则是非阻塞,先来看一下阻塞情况: // code 6 阻塞 GlobalScope.launch { delay(5000) Log.d(TAG, " 1...函数也是一个挂起函数,它可以阻塞挂起当前线程,并且在设置时间间隔之后恢复执行,可被取消。...async 返回一个 Deferred 接口对象,继承自 Job,且包含一个返回结果。Deferred 一个阻塞,可被取消对象。

1.4K30

为什么建议大家加快拥抱Kotlin,说点不一样

方便性能优化这一点主要得益于Kotlin,可以看看之前介绍文章:Android面试题之Kotlin一文搞定 和 Kotlin上下文和异常处理帮我们很好解决了一个问题,就是App...Kotlin 一种 (Coroutine) 编程模型, Kotlin 标准库一部分。...可以看作轻量级线程,它们可以在线程运行,但与传统线程不同,是非阻塞、低开销,可以极大程度地提高并发任务执行效率。Kotlin 解决传统 Java 线程管理问题1....Kotlin 轻量级,可以在同一个线程创建成千上万个,极大地减少了内存消耗。内存占用远小于传统线程。3....Kotlin 支持挂起函数(suspend functions),在等待期间释放线程资源,不会阻塞线程。使用 suspend 关键字进行阻塞操作,使得程序资源利用率更高。

4200

Coroutine()(一)

Coroutinekotlin官方文档上推荐,个人理解,其实就是一个轻量级线程库。.../ 阻塞等待 1 秒钟(默认时间单位毫秒) println("World!")...其实GlobalScope.launch可以通过Thread来替代,但要注意delay一个特殊 挂起函数 ,它不会造成线程阻塞,但是会 挂起 ,并且只能在中使用。...在内部可以像普通函数一样使用挂起函数, 不过其额外特性,同样可以使用其他挂起函数(如本例 delay)来挂起执行。...因为一段代码必须协作才能被取消 取消 协作 。一段代码必须协作才能被取消。 所有 kotlinx.coroutines 挂起函数 都是 可被取消

79510

破解 Kotlin (6) - 挂起篇

关键词:Kotlin 挂起 任务挂起 suspend 阻塞 挂起最初一个很神秘东西,因为我们总是用线程概念去思考,所以我们只能想到阻塞。不阻塞挂起到底怎么回事呢?...sleep 让线程进入休眠状态,直到指定时间之后某种信号或者条件到达,线程就尝试恢复执行,而 delay 会让挂起,这个过程并不会阻塞 CPU,甚至可以说从硬件使用效率上来讲“什么都不耽误”,从这个意义上讲...delay 也可以是让休眠一种很好手段。...当然,字节码比较抽象,我这样写出来就是为了让大家更容易理解如何执行,看到这里,相信大家对于本质有了进一步认识: 挂起函数本质上就是一个回调,回调类型就是 Continuation...执行就是一个状态机,每一次遇到挂起函数,都是一次状态转移,就像我们前面例子 label 不断自增来实现状态流转一样 如果能够把这两点认识清楚,那么相信你在学习其他概念时候就都将不再问题了

1.1K30

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

通道使用 SendChannel 和使用 ReceiveChannel 之间阻塞通信。 9.10.1 通道 vs 阻塞队列 通道概念类似于 阻塞队列(BlockingQueue)。...send函数被挂起直到另外一个调用receive函数, 然后receive函数挂起直到另外一个调用send函数。它是一个完全无锁实现。...通常多个运行在同一调度器运行在一个线程内,这也消除掉了多线程同步等带来编程复杂性。同一时刻同一调度器只有一个会处于运行状态。...而线程阻塞代价通常是昂贵,尤其在高负载时,阻塞其中一个会导致一些重要任务被延迟。 另外,挂起几乎无代价。不需要上下文切换或者 OS 任何其他干预。...我们看到通过挂起机制实现阻塞特性大大提升了我们并发性能。 最后,我们还简单介绍了实现原理以及标准API库。Kotlin实现大量地调用了Java多线程API。

1.2K20

Kotlin实现原理:挂起与恢复

所谓阻塞式挂起与恢复又是什么? 内部实现原理怎么样? ... 接下来一些文章试着来分析一下这些疑问,也欢迎大家一起加入来讨论。 挂起 使用阻塞式挂起方式来保证运行。...那么什么是非阻塞式挂起呢?下面我们来聊聊挂起到底一个怎样操作。...而它另一个关键作用是起到挂起标识。 运行时候每遇到被suspend修饰方法时,都有可能会挂起当前。 注意有可能。...由于post 1s所以比dealy还短,所以会优先输出main end,然后再过1s,进入恢复阶段 asyncdelay恢复,注意在delay方法传入了this,asyncContinuation...在需要挂起时候,先保留现场与设置下一个状态点,然后再通过退出方法方式来挂起。在挂起过程并不会阻塞当前线程。

2.1K10

即学即用Kotlin -

在这一次分享,发现 Flow 和 Channel 这一块儿知识自己不怎么了解,本文也将着重和大家聊一聊这一块儿内容,部分将分为三篇,本文第一篇: “《即学即用Kotlin - 》 《抽丝剥茧...可以使用阻塞方式写出阻塞代码,解决并发中常见回调地狱,这是其最大优点,后面介绍。 2....作用域 作用域有三种,他们分别是: runBlocking:顶层函数,它和 coroutineScope 不一样,它会阻塞当前线程来等待,所以这个方法在业务并不适用 。...原理跟九心点外卖原理一致,耗时阻塞操作并没有减少,只是交给了其他线程: ?...中出了一种叫 Mutex 锁,区别是它 lock 操作挂起阻塞,感兴趣同学可以自行查看。

1.5K20

Kotlin---使用

一个 在使用程之前,需要保证Kotlin-Gradle-Plugin版本高于1.3。目前最高版本为1.3.11。...否则编译会报错 首先来创建一个: GlobalScope.launch { // 在后台启动一个并继续 delay(1000L) // 阻塞等待 1 秒钟(默认时间单位毫秒...如果我们忘记保持对新启动引用,它还会继续运行。 阻塞runBlocking GlobalScope.launch启动了一个线程创建新,并没有阻塞当前线程。...delay()会阻塞当前线程 在runBlocking调用launch()会开启新,并且不会阻塞当前线程 在runBlocking调用launch()会在当前线程执行 main @coroutine...,才会继续执行 挂起函数代码超级多时候,通常都会把这些代码提取到一个函数

1.2K20

Kotlin 总结

a.什么时候需要自定义 suspend 函数 a.具体该怎么写 5.小结 三、挂起阻塞怎么回事 1.什么阻塞式挂起」 2.为什么要讲阻塞式挂起 3.与线程 4.小结 四、总结 一、是什么...不过,我们学习 Kotlin ,一开始确实可以从线程控制角度来切入。因为在 Kotlin 一个典型使用场景就是线程控制。...」,讲的是「阻塞式」这个挂起一个特点,也就是说,挂起,就是非阻塞不讲「阻塞挂起」概念。...四、总结 就是切线程; 挂起就是可以自动切回来切线程; 挂起阻塞式指的是它能用看起来阻塞代码写出阻塞操作,就这么简单。 参考: 1,Kotlin 用力瞥一眼 - 学不会?...很可能因为你看过教程都是错 2,Kotlin 挂起好神奇好难懂?今天我把它皮给扒了 3,到底什么阻塞式」挂起?真的更轻量级吗?

2.5K11

kotlin--启动和取消

kotlin有4启动模式 1.DEFAULT:创建后,立即开始调度,在调度前如果被取消,直接进入取消响应状态 2.ATOMIC:创建后,立即开始调度,执行到第一个挂起点之前不响应取消...1.runBlocking与coroutineScope runBlocking常规函数,它会阻塞主线程,而coroutineScope挂起函数,它们都会等待其体和子协助执行结束,作用域构建器使用上下文...二、取消 1.取消 1.取消作用域会取消它,CoroutineScope创建一个全新上下文,和coroutineScope作用域不同,作用域构建器使用上下文 fun...2.CPU密集型任务取消 1.isActive一个可以被使用在CorountineScope扩展属性,检查Job是否处于活跃状态 fun `test cancel cpu`() = runBlocking...,如果想要取消后,还能调用挂起函数,我们需要将清理代码放入NoCancellable CoroutineContext 这样会挂起运行代码,并保持取消状态,直到任务处理完成 fun

93430

Kotlin 程之Practice

Kotlin 作用 让线程主动释放CPU一个作用,一个执行后挂起,然后让另一个执行, 等到这个协执行完毕再让前一个继续执行。...可以不依赖于线程直接运行在进程通过提升CPU利用率,进而减少线程切换,进而提升程序运行效率; 启动与停止都是由代码操作,而不是操作系统调度; Kotlin 练习 Kotlin 练习参考...            //delay 挂起函数,不会造成线程阻塞,只能在中使用             delay(1000L)//无阻塞1秒然后输出             Log.i(tag...,这个协轻量级,与其他一起并发工作,与launch启动不同,launch启动返回一个Job对象     // 不带有任何返回值,而async返回一个Defrred对象一个轻量级阻塞future...挂起后,它将完全由所运行线程恢复挂起函数,     //受限调度器合适,它在没有消耗CPU时间或共享数据时被限制在指定线程     fun testDispatcherMain() =

1.1K20
领券