正确实施Kotlin的等待和通知

根据这个文件,使用waitnotify在Kotlin中是不鼓励的: https : //kotlinlang.org/docs/reference/java-interop.html

等待()/通知()

有效的Java Item 69建议优先使用并发实用程序wait()和notify()。 因此,这些方法在Any类型的引用上不可用。

但是文件并没有提出任何正确的方法。

基本上,我想实现一个服务,它将读取输入数据并处理它们。 如果没有输入数据,它会暂停自己,直到有人通知有新的输入数据。 就像是

 while (true) { val data = fetchData() processData(data) if (data.isEmpty()) { wait() } } 

编辑:

我不想使用这些不推荐的方法(反模式),我真的想找出如何正确地做到这一点。

在我的情况下, fetchData从数据库中读取数据,所以在我的情况下,队列不能被使用。

BlockingQueue可以是适合您的用例的高级并发实用程序,但是应用它需要知道并修改您的代码结构。

这个想法是, fetchData()应该从队列中.take()一个项目,如果队列是空的,这将阻止执行,直到出现一个项目,这就消除了代码中的.wait() 。 数据的生产者应该将数据输入到队列中。


如果你真的需要使用waitnotify ,例如在低级实现一个并发工具,你可以把一个Kotlin对象转换成java.lang.Object然后调用这些函数,就像在语言引用中所说的那样。 或者,写成扩展功能:

 @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") private fun Any.wait() = (this as java.lang.Object).wait()