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

启动协程构建器是否会导致挂起函数在新线程上运行?

启动协程构建器不会导致挂起函数在新线程上运行。

协程是一种轻量级的线程,由开发者控制其调度和执行,它们运行在同一个线程中。启动协程构建器会创建一个协程对象,但是该协程对象不会立即执行。相反,它需要通过协程调度器来调度执行。

协程调度器根据一定的调度策略来决定如何执行协程。默认情况下,调度器会在当前线程上执行协程。这意味着挂起函数仍然在同一线程上运行,而不会创建新的线程。

在协程中使用的挂起函数,例如网络请求、文件读写等操作,通常会使用非阻塞的方式,从而避免线程阻塞。这可以提高应用程序的并发性和响应性能。

当然,在某些情况下,可以通过指定不同的调度器来使协程在新线程上运行。但是这不是启动协程构建器的默认行为。

总而言之,启动协程构建器不会导致挂起函数在新线程上运行,而是由协程调度器决定协程的执行方式。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

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

2K40

Android面试题之Kotlin协程一文搞定

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

19610
  • Kotlin 协程和 Android SQLite API 中的线程模型

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

    1.9K20

    Kotlin 协程实现原理解析

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

    59910

    Kotlin协程系列(二)

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

    25810

    6个Android Kotlin协程相关面试题

    解答: launch和async都是用于启动新协程的构建器,但它们有以下不同点: launch:返回一个Job对象,用于表示协程的执行,不直接返回结果。...面试题目2:描述Kotlin协程中的runBlocking构建器的作用及其潜在问题。 解答: runBlocking是一个协程构建器,它会立即启动协程并在当前线程阻塞,直到协程执行完成。...这通常用于主函数或测试中,以同步方式执行异步代码。然而,runBlocking在Android中可能会导致主线程阻塞,从而影响UI的响应性,因此应谨慎使用。...解答: withContext是一个挂起函数,它允许你切换协程的上下文(即线程)。...解答: 协程和线程都是用于并发编程的工具,但它们有显著的区别: 协程: 轻量级:协程是轻量级的,它们在同一个线程中运行,可以在不阻塞线程的情况下挂起和恢复。

    25310

    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 构建器声明自己的作用域。它会创建一个协程作用域,并且会等待所有已启动子协程执行完毕。

    81500

    在 Android 开发中使用协程 | 代码实战

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

    1.2K10

    协程笔记

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

    87530

    在 Android 开发中使用协程 | 上手指南

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

    1.5K20

    【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

    1.1K10

    《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很受调度器的影响。

    19010

    写给Android工程师的协程指南

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

    1.5K40

    使用协程和 Flow 简化 API 设计

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

    1.6K20

    Android协程的7个必要知识点

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

    75652

    Kotlin协程:理解主要概念

    } 1.2 挂起函数(Suspend Function) 挂起函数是一种可以在不阻塞线程的情况下挂起和恢复执行的函数。在Kotlin中,我们可以使用suspend关键字来定义一个挂起函数。...子协程的生命周期受其父协程作用域的约束,当父协程作用域结束时,所有子协程都会被取消。 1.5 launch launch函数是一种协程构建器,它用于创建并启动一个新的协程。...val job = GlobalScope.launch { doSomething() } job.cancel() // 取消协程 1.6 async async函数也是一种协程构建器,它用于创建并启动一个新的协程...withContext通常用于在不同的调度器(Dispatcher)之间切换协程的执行线程。...IO 调度器上执行耗时操作 performIoOperation() } // 在默认调度器上处理结果 processResult

    10910

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

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

    74440

    kotlin 协程入门教程

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

    20810

    (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 状态时取消。上游数据流会在后台保持活跃状态,并可能会发出新的项并耗用资源。 需要给定一个初始值。

    1K40
    领券