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

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

3.4 启动模式 前述进行创建启动时涉及到了启动模式CoroutineStart,其是一个枚举类,为构建定义启动选项。构建的start参数中使用。...指定运行挂起代码块,放在该块内的任何代码都始终通过IO调度执行,并挂起直至代码块运行完成。...“挂起”是指从它当前线程脱离,切换到另一个线程运行。当线程运行到suspend函数时,暂时挂起这个函数及后续代码的执行。简而言之,挂起函数是一个可以启动、暂停和恢复的函数。...关于挂起有三点注意事项: 启动其他并不会挂起当前,所以launch和async启动线程时,除非运行在当前线程,则当前只能在运行完成后继续执行,否则当前都会马上继续运行。...挂起挂起函数是一个可启动、暂停和恢复的函数,被suspend修饰的函数运行时不是一定会被挂起的。 挂起函数挂起实现原理就是状态机的状态转移。

1.7K40

Android面试题之Kotlin一文搞定

,稍后再在挂起得位置恢复 挂起函数 使用suspend关键字修饰的函数 挂起函数只能在体内或其他挂起函数内调用 挂起和阻塞的区别 挂起不会阻塞主线程,主线程可以正常刷新UI,但阻塞就会导致线程ANR...lifecycleScope:只能在Activity、Fragment中使用,绑定Activity、Fragment的生命周期 构建 launch和async构建都用来启动 launch...事实await()也不一定导致会被挂起,await() 只有 async 未执行完成返回结果时,才会挂起。...若 async 已经有结果了,await() 则直接获取其结果并赋值给变量,此时不会挂起 构建 是否立即启动? 串行?并行? 是否阻塞当前线程?...是常规函数阻塞当前线程;coroutineScope是挂起函数,不会阻塞当前线程 它们都会等待体以及所有子结束,一个是阻塞线程等待,一个是挂起等待 作用域构建 coroutineScope

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

使用kotlin提高app性能(译)

Android有助于解决两个主要问题: 管理长时间运行的任务,否则可能阻止主线程导致应用冻结。 提供主安全性,或从主线程安全地调用网络或磁盘操作。...您只能从其他suspend函数调用suspend函数,或者使用诸如启动之类的构建启动。 在上面的示例中,get()仍然线程运行,但它在启动网络请求之前挂起协同程序。...暂停函数线程运行是正常的。 线程启动协同程序也很常见。...async启动一个的协同程序,并允许您使用名为await的挂起函数返回结果。 通常,您应该从常规函数启动,因为常规函数无法调用等待。...但请注意,即使我们没有调用awaitAll(),coroutineScope构建也不会恢复调用fetchTwoDocs的,直到所有完成。

2.3K10

Kotlin 和 Android SQLite API 中的线程模型

,所以这部分代码就有可能使用一个不同的调度启动,这样就会导致执行数据库操作的是另外的一个线程。...这一机制能够让子继续使用同一个调度,或在父被取消时,它们会被一起取消。本质,Room 提供的挂起事务 API 创建一个专门的上下文来同一个事务作用域下执行数据库操作。...事务开始时,Room 获得 executor 中某个线程的控制权,直到事务结束。事务执行期间,即使调度因子发生了变化,已执行的数据库操作仍会被分配到该事务线程。 ...Room 中的阻塞函数,包含 DAO 生成的那些,它们被事务调用后会被特殊处理,用来保证它们不会在其他的调度运行。...通过将 ThreadContextElement 添加到上下文中,并从 DAO 函数中访问它,我们可以验证阻塞函数是否处于正确的作用域中。如果不是, 我们抛出异常而不是造成死锁 。

1.8K20

Kotlin 实现原理解析

构建Kotlin 通过构建(如 launch 和 async)来启动。这些构建是顶层函数,它们接受一个上下文(CoroutineContext)和一个体(lambda 表达式)。...结构化并发中,可以使用coroutineScope函数创建一个的作用域,它会等待所有启动的子完成后才会继续执行。...挂起函数内部,可以调用其他挂起函数,这使得可以执行长时间操作而不会阻塞线程挂起函数通过使用suspend关键字来标记,这告诉编译函数需要特殊处理。...Kotlin库提供了几种调度,如Dispatchers.Main用于线程执行,Dispatchers.IO用于执行I/O密集型任务,Dispatchers.Default用于CPU密集型任务...调度上下文的一部分,可以启动时指定,dispatch 方法负责将的执行调度到适当的线程。。调度器使得可以适应不同的执行需求,提高了应用程序的性能和响应性。

39410

Kotlin系列(二)

因此,对于的创建,框架中也要根据不同的目的提供不同的构建(例如launch,async),其背后对于封装出来的复合的类型描述,就是至关重要的一环。   ...,isActive可以类比Thread的isActive(),用于查询是否还在运行。...但不适合执行可能导致线程阻塞的操作 主线程调度(Dispatchers.Main):适用于 Android 应用程序中执行 UI 操作的。...IO 调度器使用一个专门的线程池,允许执行大量的 IO 操作而不阻塞线程 无限制调度(Dispatchers.Unconfined):允许调用挂起函数线程中继续执行,直到第一个挂起点。...该作用域包括以下三种: 顶级作用域:没有父所在的作用域为顶级作用域 协同作用域:启动为所在的子,这种情况下子所在的作用域默认为协同作用域。

22610

Kotlin语言基础入门到熟悉:Kotlin基础

结构化的并发 用GlobalScope.launch时,创建一个顶层。它不使用主线程。新创的虽然轻量,但仍会消耗一些内存资源。如果忘记保持对启动的引用,它还会继续运行。...我们可以代码中使用结构化并发。 示例中,我们使用runBlocking构建将main函数转换为。在里面(作用域)启动不需显式使用join。... runBlocking 作用域中启动一个1 println("1所在线程id ${Thread.currentThread().id}") delay(300) println...("1执行完毕") } launch { // runBlocking 作用域中启动一个2 println("2所在线程id ${Thread.currentThread(...程序等待它所有的执行完毕,然后真正退出。 4. 作用域构建 使用 coroutineScope 构建声明自己的作用域。它会创建一个作用域,并且等待所有已启动执行完毕。

78000

Android 开发中使用 | 代码实战

Room 的挂起函数是主线程安全的,并运行于自定义的调度中。...ViewModel 线程启动,一旦有结果后就结束执行; Repository 提供了保证主线程安全的挂起函数; 数据库和网络层提供了保证主线程安全的挂起函数。...数据层 (网络或数据库) 总是提供挂起函数,使用 Kotlin 的时候要保证这些挂起函数是主线程安全的,Room 和 Retrofit 都遵循了这一点。...当启动一个来响应 UI 事件时,要去考虑一下用户若在上一个任务未完成之前又开始了的任务,会有什么样的后果。 这其实是一个并发导致的问题,它和是否使用了其实没有什么关系。...Mutex 保证同时只会有一个运行,并且按照启动的顺序依次结束。

1.1K10

笔记

挂起:suspend 里suspend是一个重要的关键字,这个关键字只是起到的提醒的作用,当代码执行到suspend时,从当前线程挂起这个函数,然后代码继续执行,而挂起函数从当前线程脱离,然后继续执行...,这个时候在哪个线程执行,由调度所指定,挂起函数执行完之后,又会重新切回到它原先的线程来。...讲切线程之前,我们先说说Dispatchers调度,它可以将程限制一个特定的线程执行,或者将它分派到一个线程池,或者让它不受限制地运行。...,才线程中执行挂起函数 ; 如果在主线程启动 , 则该模式的就会直接在主线程中执行 ; 如果在子线程启动 , 则该模式的就会直接在子线程中执行 ; 异常处理 对于不同构造...(val response: CompletableDeferred) : CounterMsg() // 携带回复的请求 接下来定义一个函数,使用 actor 构建启动一个 actor

81330

【Kotlin 启动 ④ ( 启动模式 | 构建启动模式参数 | DEFAULT 模式 | ATOMIC 模式 | LAZY 模式 | UNDISPATCHED 模式 )

文章目录 一、构建 CoroutineScope.async 函数 1、构建 CoroutineScope.async 函数参数分析 2、构建 CoroutineScope.async...一、构建 CoroutineScope.async 函数 ---- 1、构建 CoroutineScope.async 函数参数分析 构建 CoroutineScope.async 函数中...; 上述代码中 , 调用 runBlocking 函数 , 可以将 主线程 包装成 , launch 启动 , 该运行在主线程中 , 运行到 delay(2000) 代码时 , 该 delay...函数挂起函数 , 主线程会被挂起 , 主线程被调度调度 , 执行其它的操作 如 刷新 UI 等操作 , 挂起函数中的内容会在子线程中执行 , 如果 launch 启动时 , 此时会被调度 立即调度..., 才线程中执行挂起函数 ; 如果在主线程启动 , 则该模式的就会直接在主线程中执行 ; 如果在子线程启动 , 则该模式的就会直接在子线程中执行 ; 代码示例 : Dispatchers.IO

96510

Android 开发中使用 | 上手指南

通过常规函数之上增加 suspend 和 resume 两个操作来解决上述问题。当某个特定的线程的所有被 suspend 后,该线程便可腾出资源去处理其他任务。...有两种方式能够启动,它们分别适用于不同的场景: launch 构建适合执行 "一劳永逸" 的工作,意思就是说它可以启动而不将结果返回给调用方; async 构建启动并允许您使用一个名为... launch 函数体内,您可以调用 suspend 函数并能够像我们一篇介绍的那样保证主线程安全。 Launch 是将代码从常规函数送往世界的桥梁。...另外,如果随意启动,可能导致潜在的任务泄漏 (work leak)。调用方可能感知不到启用了,也就意味着无法对其进行追踪。...因此,只有 coroutineScope 构建启动的所有完成任务之后,fetchTwoDocs 函数才会返回。

1.4K20

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

因为,我们有两个任务并发的执行。 从概念讲, async跟launch类似, 它启动一个, 它与其他并发地执行。...9.9.1 调度和线程 上下文包括一个调度程序, 它可以指定由哪个线程来执行。调度可以将的执行调度到一个线程池,限制特定的线程中;也可以不作任何限制,让它无约束地运行。...capacity 通道缓存容量大小 (默认没有缓存) block 代码块 produce函数启动一个, 中发送数据到通道来生成数据流,并以 ProducerJob对象返回对的引用...通常多个运行在同一调度中的运行在一个线程内,这也消除掉了多线程同步等带来的编程复杂性。同一时刻同一调度中的只有一个处于运行状态。...而线程阻塞的代价通常是昂贵的,尤其高负载时,阻塞其中一个导致一些重要的任务被延迟。 另外,挂起几乎是无代价的。不需要上下文切换或者 OS 的任何其他干预。

1.2K20

Kotlin中的Android中的应用

Kotlin的一个可以理解为是运行线程的一个执行任务并且该任务可以不同的线程间切换,一个线程可以同时运行多个协。...创建的方式 runBlocking 这是一个顶层函数启动一个并阻塞调用它的线程,直到里面的代码执行完毕,返回值是泛型T。...比如:网络请求,数据库操作,文件操作等 Main:UI调度,只有UI编程平台上有意义,用于更新UI,例如Android中的主线程 Unconfined:非受限调度,无所谓调度,当前可以运行在任意线程...挂起函数的特点是“挂起与恢复”,当遇到挂起函数时,会被挂起,等挂起函数执行完毕以后,恢复到挂起的地方重新运行。...UNDISPATCHED在这种模式下直接开始在当前线程下执行,直到运行到第一个挂起点。和ATOMIC很像,但UNDISPATCHED很受调度的影响。

11910

写给Android工程师的指南

相应的,Kotlin 具有以下特点: 轻量:您可以单个线程运行多个协,因为支持挂起,不会使正在运行线程阻塞。挂起比阻塞节省内存,且支持多个并行操作。...,并启动了一个的子c1,该内部调用了 getMessages() 方法,用于获得一个 String类型 的消息。...对于挂起函数而言,是否真的被挂起,通过函数返回值来确定,但相应的,如果我们有挂起函数需要具备返回类型呢?那如果该函数没有挂起呢?...如果使用,它并不创建线程jvm平台,其是利用少量的线程来实现并发执行,支持线程中执行,并使用 挂起与恢复 机制来允许并发执行。 性能很高?...故某个角度而言,的性能相比不恰当的使用线程池,是更高。 所以如果我们的场景对性能有这极致要求,比如应用启动框架等,那么此时使用往往并不是最佳选择。

1.3K40

使用和 Flow 简化 API 设计

的执行完成而不阻塞线程 suspend fun ListenableFuture.await(): T 使用这些函数,您可以摆脱回调并挂起直到 future 的结果被返回。...事实,我们 后台线程任务运行指南 中将回调作为 Java 编程语言的默认解决方案。然而,回调也有许多缺点: 这一设计会导致令人费解的回调嵌套。同时,由于没有简单的传播方式,错误处理也更加复杂。...(): Location 由于这是一个一次性异步操作,我们使用 suspendCancellableCoroutine 函数: 一个用于从库创建挂起函数的底层构建块。...suspendCancellableCoroutine 执行作为参数传入的代码块,然后等待继续信号期间挂起的执行。...这里挂起 //直到某个回调调用了 continuation 参数 } 注意: 尽管库中同样包含了不可取消版本的构建 (即 suspendCoroutine),但最好始终选择使用

1.6K20

Android的7个必要知识点

学会创建、启动和取消协。 上下文与调度: 理解上下文的概念,包括调度(Dispatcher)的作用,如何在不同的线程执行代码。...通过挂起函数(suspend函数)实现异步操作,而不会阻塞线程的工作原理 的核心是通过调度(Dispatcher)不同的线程执行任务。...上下文与调度 上下文是运行时的环境,包含了许多不同的元素,如调度、异常处理等。调度(Dispatcher)是上下文的一部分,它决定了在哪个线程执行。...不同线程执行 使用不同的调度,我们可以不同的线程执行代码,从而优化并发处理和性能。...作用域内启动时,它们继承作用域的上下文和调度

46341

(StateFlow & ShareFlow) VS (Flow & LiveData)来看业务适合哪个?

之前的Flow,collect函数浅析和仿Flow构建创建数据流文章中我们探索了flow的简单使用及它的简单原理,但是生产过程中我们往往借用这些基础的api实现我们复杂的逻辑处理,根据需求也推出了...的一种)运行切换线程的操作更加方便数据回溯:相比于LiveData自动管理version来决定是否通知Ovserve并且只能收到最新值的方式,Flow可通过构造函数配置reply字段决定获取之前的几次数据更新生命周期处理... Lifecycle 被销毁时取消;也可以通过when生命周期来指定何时开启,如果 Lifecycle 未至少处于所需的最低状态,则会挂起在这些块内运行的任何,注意是挂起而不是销毁时的取消,意味着还是浪费资源...但是我们可以使用repeatOnLifecycle,它当离开某个生命周期的时候进行取消,符合的时候开启一个(也即重新执行collect函数的订阅者)。...由于后面的 API 挂起,而不是 Lifecycle 处于 STOPPED 状态时取消。上游数据流会在后台保持活跃状态,并可能会发出新的项并耗用资源。需要给定一个初始值。

58440

(StateFlow & ShareFlow) VS (Flow & LiveData)

theme: condensed-night-purple highlight: vs 之前的Flow,collect函数浅析和仿Flow构建创建数据流文章中我们探索了flow的简单使用及它的简单原理...,CoruntineContext的一种)运行切换线程的操作更加方便 数据回溯:相比于LiveData自动管理version来决定是否通知Ovserve并且只能收到最新值的方式,Flow可通过构造函数配置...2.lifecycleScope: 此范围内启动会在 Lifecycle 被销毁时取消;也可以通过when生命周期来指定何时开启,如果 Lifecycle 未至少处于所需的最低状态,则会挂起在这些块内运行的任何...但是我们可以使用repeatOnLifecycle,它当离开某个生命周期的时候进行取消,符合的时候开启一个(也即重新执行collect函数的订阅者)。...由于后面的 API 挂起,而不是 Lifecycle 处于 STOPPED 状态时取消。上游数据流会在后台保持活跃状态,并可能会发出新的项并耗用资源。 需要给定一个初始值。

97540

kotlin 入门教程

链接:https://juejin.cn/post/7370994785655767067 本文由作者授权发布 是什么 广义的定义(Coroutine)是指相互协作的程序。...除此之外,当其中一个线程没有任务时,kotlin线程池则会尝试分发其他线程的任务给空闲线程。至于这么做有什么好处,官方给的答案是以最有效的方式工作线程分发已调度的任务。...挂起函数 挂起函数是指方法声明前加上 suspend 关键字的函数。它的作用主要是挂起与恢复。其实说挂起和恢复比较难理解,其实简单的说挂起就是任务从当前线程脱离,恢复则是任务回到了原线程。...GlobalScope 本身不会阻塞当前线程,且启动相当于守护线程,不会阻止 JVM 结束运行。...它内部的线程数量一般更多一些 Dispatchers.Unconfined,对执行线程不做限制,可以直接在当前调度所在线程执行 Dispatchers.Main,Android中,表示UI

13310

理解心得-初探

但是如果是调用挂起函数启动比如withContext并不是通过this获取的父上下文,而是通过调用挂起函数必须传一个Continuation参数,所以他是通过获取这个参数然后拿到父上下文的...我们调用lauch启动一个的时候,编译只会给我们创建一个匿名内部类,并不会为每一个挂起函数都创建一个匿名内部类耗性能,但是他是怎么做到一个匿名内部类管理所有的挂起函数的呢,答案就是状态机。...检测挂起函数有几个然后设置几个状态,调用resumeWith的时候会调用invokeSuspend执行体,这个时候检查体里面接下来的函数的返回值:如果调用到挂起函数的时候,线程(不一定需要根据的上下文获取调度决定...【】 我怎么知道我的上下文信息,我该运行在哪个线程或者我该怎么知道我的名字和我的启动模式【说】 答案:通过上下文!!!...拦截会在刚开启的时候回调一次,接着调用resumeWith的时候也回调一次(挂起函数回复),所以为n+1次【n是挂起函数有几个里面】 前面说过执行的时候会有一个作用域,作用域里面包含的你的上下文信息

33440
领券