gpt4 book ai didi

android - 挂起函数是否在另一个线程中执行并返回结果?

转载 作者:行者123 更新时间:2023-12-02 12:19:24 25 4
gpt4 key购买 nike

我在网上看了很多文章,但我仍然有点困惑,当挂起函数在协程中挂起时,具体会发生什么,一步一步。

我知道挂起函数,在底层,只是一个常规函数,带有允许它恢复的 Continuation 参数,但我的困惑是关于挂起函数或协程去哪里以及恢复后它会在哪里返回。

我听一些人说“他们不一定会回到同一个线程”,我不明白,有人可以逐步向我解释一下吗?

最佳答案

TLDR;

没有保证,它可能会或可能不会,
这实际上取决于以下几点:

  • 调度程序是多线程的吗?
  • 两者之间是否有任何调度程序覆盖?

  • 长答案

    协程有一个 CoroutineContext 来指定它的行为方式和运行位置。

    一个 CoroutineContext 主要由四个元素组成: Job , CoroutineName , CoroutineExceptionHandlerDispatcher .

    调度员负责调度协程。可以暂停调度程序以停止协程甚至运行(这在单元测试中很有用) mentioned here in the android conference talk ,它可能是一个单线程调度程序,就像 Dispatchers.Main ,它有一个像 javascript 一样的事件循环。

    因此,这实际上取决于以下几点:
  • 调度程序是多线程的吗?

  • 例如:这将在单线程上运行。

    suspend fun main() {
    val dispatcherScope = CoroutineScope(Executors.newSingleThreadExecutor().asCoroutineDispatcher())

    val job = dispatcherScope.launch {
    repeat(10) {
    launch {
    println("I'm working in thread ${Thread.currentThread().name}")
    // every coroutine on same thread
    }
    }
    }
    job.join()
    }

    Run it here ,其他单线程调度程序:Dispatchers.Main
  • 两者之间是否有任何调度程序覆盖?

  • 使用相同的上下文,如果我们在启动前重写调度程序,即使原来的上下文是基于单线程事件循环的,它也会改变线程,每个协程将运行在不同的线程上,创建 10 个不同的线程:

    dispatcherScope.launch {
    repeat(10) {
    launch(Dispatchers.IO) {
    println("I'm working in thread ${Thread.currentThread().name}")
    // every coroutine on same thread
    }
    }
    }

    Run it here ,其他多线程调度程序:Dispatchers.Default,基于执行程序的调度程序,Dispatchers.Unconfined(此在任何空闲线程中启动协程)。

    关于android - 挂起函数是否在另一个线程中执行并返回结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61379260/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com