我试图确保这两种方法是同步的。我注意到协程比线程更难同步。如果我调用start()
,我如何保证?然后 stop()
我的代码实际上会在最后停止吗?
object Test {
private val coroutine = CoroutineScope(Dispatchers.IO)
@Synchronized
fun start() {
coroutine.launch {
// some work
}
}
@Synchronized
fun stop() {
coroutine.launch {
// clean up then stop
}
}
}
我担心的是我调用
start()
然后 stop()
但实际上 stop 先执行。所以我的代码在它应该停止的时候继续。
最佳答案
命令的同步或顺序执行是两件不同的事情。
如果您需要执行“开始”然后“停止”,只需不要使用您的“coroutine.launch”创建新的协程,而是为您的函数使用暂停关键字,然后像这样执行它们:
suspend fun start() {}
suspend fun stop() {}
fun main() {
scope.launch {
start()
stop()
}
}
但是如果你想同步两种方法,你可以阅读 an official Kotlin guide to shared mutable state这提出了一些很好的解决方案。并做一些这样的想法:val mutex = Mutex()
suspend fun main() {
mutex.withLock {
start()
stop()
}
}
关于android - 如何同步协程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59998741/