正确实施Kotlin的等待和通知
根据这个文件,使用wait
和notify
在Kotlin中是不鼓励的: https : //kotlinlang.org/docs/reference/java-interop.html
等待()/通知()
有效的Java Item 69建议优先使用并发实用程序wait()和notify()。 因此,这些方法在Anytypes的引用上不可用。
但是文件并没有提出任何正确的方法。
基本上,我想实现一个服务,它将读取输入数据并处理它们。 如果没有输入数据,它会暂停自己,直到有人通知有新的输入数据。 就像是
while (true) { val data = fetchData() processData(data) if (data.isEmpty()) { wait() } }
编辑:
我不想使用这些不推荐的方法(反模式),我真的想找出如何正确地做到这一点。
在我的情况下, fetchData
从数据库读取数据,所以在我的情况下队列不能使用。
BlockingQueue
可以是适合您的用例的高级并发实用程序,但是应用它需要知道并修改您的代码结构。
这个想法是, fetchData()
应该从队列中.take()
一个项目,如果队列是空的,这将阻止执行,直到出现一个项目,这将消除代码中的.wait()
。 数据的生产者应该将数据输入到队列中。
如果你真的需要使用wait
和notify
,例如在低级实现一个并发工具,你可以把一个Kotlin对象转换成java.lang.Object
然后调用这些函数,就像在语言引用中所说的那样。 或者,写成扩展function:
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") private fun Any.wait() = (this as java.lang.Object).wait()