Kotlin Coroutines顺序执行

时间:2019-06-06 15:14:46

标签: kotlin kotlin-coroutines

我正在尝试创建一个对象,该对象可以像在队列中一样在其自己的线程中顺序执行一些任务。

以下示例仅用于演示我的设置,可能是完全错误的。

a started
b started
a completed
b completed

现在此代码显示以下内容

a

表示ba并行执行。可以从不同的线程调用方法bcomplexcomplex。当然,a started a completed b started b completed 方法也应支持此概念。现在,我需要一种机制,该机制一次只能执行一个任务,因此可以获得以下输出:

actor

我做了一些研究,认为Channelactor可以满足需要,但是{{1}}暂时被标记为陈旧({{3 }})。我不喜欢使用可能会更改的API的想法,所以我想以一种通用的方式来做。

1 个答案:

答案 0 :(得分:1)

您可以通过MutexwithLock调用来完成此操作。例如:

class CoroutinesTest {
    private val lock = Mutex()
    
    fun a() {
        GlobalScope.launch {
            lock.withLock {
                println("a started")
                delay(1000)
                println("a completed")
            }
        }
    }

    fun b() {
        GlobalScope.launch {
            lock.withLock {
                println("b started")
                delay(2000)
                println("b completed")
            }
        }
    }

    fun complex() {
        a()
        b()
    }
}

哪个输出为

a started
a completed
b started
b completed

如果要在范围内更好地控制执行顺序,可以将工作与启动调用分开

class CoroutinesTest {
    private val lock = Mutex()
    
    suspend fun aImpl() {
        lock.withLock {
            println("a started")
            delay(1000)
            println("a completed")
        }
    }

    suspend fun bImpl() {
        lock.withLock {
            println("b started")
            delay(2000)
            println("b completed")
        }
    }

    fun a() {
        GlobalScope.launch { aImpl() }
    }

    fun b() {
        GlobalScope.launch { bImpl() }
    }

    fun complex() {
        GlobalScope.launch {
            aImpl()
            bImpl()
        }
    }
}