kotlin - 在 Kotlin 中正确实现等待和通知

标签 kotlin

根据本文档,在 Kotlin 中不鼓励使用 waitnotify: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.ReadLockReentrantReadWriteLock.WriteLock).

请注意,withLock 是 Kotlin 提供的扩展函数,负责调用 Lock.lock()/Lock.unlock()在调用提供的 lambda 之前/之后。

关于kotlin - 在 Kotlin 中正确实现等待和通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44589669/

相关文章:

kotlin - 如何将函数引用保存为 Map 类型中的值,并稍后在 Kotlin 中使用参数调用它?

android - 如何更新可组合函数内的 RecyclerView 的数据?

android - 监听器绑定(bind);找不到二传手

kotlin - 为什么专家将 MutableList 更改为 List?

android - 为什么我的类路径中有不同版本的 Kotlin JAR?

java - Kotlin 属性的私有(private) getter 和公共(public) setter

android - 将字符串转换为 LocalDateTime

java - Kotlin 解构变量不适用于 Pair、Triple 或数据类

android - 上传图像,Firebase 显示 "User does not have permission to access this object",即使存储设置是公开的

android - 无法覆盖 androidx.fragment.app.Dialog 的 onCreateDialog 方法