gpt4 book ai didi

android - 如何使用 kotlin 协程并行运行两个作业但等待另一个作业完成

转载 作者:行者123 更新时间:2023-12-02 12:08:07 29 4
gpt4 key购买 nike

我在下面有这些工作:

  • 异步膨胀复杂的日历 View
  • 下载事件 A
  • 下载事件 B
  • 将日历 View 添加到其父级
  • 将 A 事件添加到日历
  • 将 B 事件添加到日历中

  • 我想
  • 1、2、3要启动异步,
  • 4 必须等待 1
  • 5 必须等待 2 和 4
  • 6 必须等待 3 和 4
  • 6和5不应该相互依赖,可以在不同的时间运行。
  • 4 只依赖于 1,所以它可以在 2 或 3 完成之前运行。

  • 我尝试过异步等待,但它使它们同时完成(如预期的那样)。我认为这个例子可能是学习并行编程概念的好方法,比如信号量互斥锁或自旋锁。但这对我来说太复杂了,我无法理解。

    我应该如何使用 Kotlin 协程来实现这些?

    最佳答案

    这很简单。您需要做的就是:

  • 实现CoroutineScope并创建 CoroutineContext , 或使用 GlobalScope .
  • 使用本地 CoroutineScopeGlobalScope.launch()启动协程。
  • 在协程中使用 async/await运行/等待异步操作。

  • 您可以将下一个代码应用于您的算法(所有解释都在评论中):
    class SomeClass : CoroutineScope {
    private var job: Job = Job()

    // creating local CoroutineContext
    override val coroutineContext: CoroutineContext
    get() = Dispatchers.Main + job

    // cancel the Job if it is no longer needed
    fun onClear() {
    job.cancel()
    }

    fun doJob() {
    // launch coroutine
    launch {
    // run Job1, Job2, Job3 in parallel, asyncIO - is an extension function on CoroutineScope
    val d1 = asyncIO { job1() }
    val d2 = asyncIO { job2() }
    val d3 = asyncIO { job3() }

    // waiting for result of Job1
    val job1Result = d1.await()

    // run Job4
    val d4 = asyncIO { job4(job1Result) }

    // waiting for result of Job2 and Job4
    val job2Result = d2.await()
    val job4Result = d4.await()

    // run Job5
    val d5 = asyncIO { job5(job2Result, job4Result) }

    // waiting for result of Job3
    val job3Result = d3.await()

    // run Job6
    val d6 = asyncIO { job6(job3Result, job4Result) }

    onDone(d5.await(), d6.await())
    }
    }

    private fun onDone(job5Result: String, job6Result: String) {
    // do something with result of Job5 and Job6
    }


    fun job1(): String {
    return "Result of job1"
    }

    fun job2(): String {
    return "Result of job2"
    }

    fun job3(): String {
    return "Result of job3"
    }

    fun job4(job1Result: String): String {
    return "Result of job4"
    }

    fun job5(job2Result: String, job4Result: String): String {
    return "Result of job5"
    }

    fun job6(job3Result: String, job4Result: String): String {
    return "Result of job6"
    }

    // extension function
    fun <T> CoroutineScope.asyncIO(ioFun: () -> T) = async(Dispatchers.IO) { ioFun() }
    }

    关于android - 如何使用 kotlin 协程并行运行两个作业但等待另一个作业完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53921470/

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