gpt4 book ai didi

Kotlin 协程顺序执行

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

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

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

class CoroutinesTest {
fun a() {
GlobalScope.launch {
println("a started")
delay(1000)
println("a completed")
}
}

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

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

fun main() {
runBlocking {
val coroutinesTest = CoroutinesTest()

coroutinesTest.complex()

delay(10000)
}
}

现在此代码打印以下内容
a started
b started
a completed
b completed

这意味着 ab并行执行。方法 a , bcomplex可以从不同的线程调用。当然, complex方法也应该支持这个概念。现在,我需要一种允许我一次只执行一个任务的机制,这样我就可以得到以下输出:
a started
a completed
b started
b completed

我做了一些研究,认为 actorChannel可以做需要的,但是 actor现在被标记为过时( issue #87 )。我不喜欢使用可能会发生变化的 API 的想法,所以我想以一种通用的方式来做这件事。

最佳答案

您可以使用 Mutex 完成此操作。和 withLock称呼。例如:

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()
}
}
}

关于Kotlin 协程顺序执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56480520/

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