根据本文档,在 Kotlin 中不鼓励使用 wait
和 notify
:https://kotlinlang.org/docs/reference/java-interop.html
wait()/notify()
Effective Java Item 69 kindly suggests to prefer concurrency utilities to wait() and notify(). Thus, these methods are not available on references of type Any.
但是该文档没有提出任何正确的方法。
基本上,我想实现一个服务,它会读取输入数据并处理它们。如果没有输入数据,它将暂停自己,直到有人通知有新的输入数据。类似的东西
while (true) {
val data = fetchData()
processData(data)
if (data.isEmpty()) {
wait()
}
}
编辑:
我不想使用这些不推荐的方法(反模式),我真的很想知道如何正确地做到这一点。
在我的例子中,fetchData
从数据库中读取数据,所以在我的例子中不能使用队列。
最佳答案
一般来说,您应该尽可能使用更高级别的并发实用程序。
但是,如果在您的情况下没有更高级别的构造起作用,则直接
替换是使用
ReentrantLock
和一个
Condition
在那把锁上。
例如,如果您的 Java 代码类似于:
private Object lock = new Object();
...
synchronized(lock) {
...
lock.wait();
...
lock.notify();
...
lock.notifyAll();
...
}
您可以将其更改为以下 Kotlin:
private val lock = ReentrantLock()
private val condition = lock.newCondition()
lock.withLock { // like synchronized(lock)
...
condition.await() // like wait()
...
condition.signal() // like notify()
...
condition.signalAll() // like notifyAll()
...
}
虽然这有点冗长,但条件确实提供了一些额外的
灵 active ,因为您可以在单个锁上设置多个条件,并且
还有其他类型的锁(特别是 ReentrantReadWriteLock.ReadLock
和
ReentrantReadWriteLock.WriteLock
).
请注意,withLock
是 Kotlin 提供的扩展函数,负责调用 Lock.lock()
/Lock.unlock()
在调用提供的 lambda 之前/之后。
关于kotlin - 在 Kotlin 中正确实现等待和通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44589669/