我正在尝试创建一个对象,该对象可以像在队列中一样在其自己的线程中顺序执行一些任务。
以下示例仅用于演示我的设置,可能是完全错误的。
a started
b started
a completed
b completed
现在此代码显示以下内容
a
表示b
和a
并行执行。可以从不同的线程调用方法b
,complex
和complex
。当然,a started
a completed
b started
b completed
方法也应支持此概念。现在,我需要一种机制,该机制一次只能执行一个任务,因此可以获得以下输出:
actor
我做了一些研究,认为Channel
和actor
可以满足需要,但是{{1}}暂时被标记为陈旧({{3 }})。我不喜欢使用可能会更改的API的想法,所以我想以一种通用的方式来做。
答案 0 :(得分:1)
您可以通过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()
}
}
}