2017-06-16 57 views
2

通知根据这一文件,使用waitnotify在科特林气馁:https://kotlinlang.org/docs/reference/java-interop.html正确实施的等待和科特林

的wait()/通知()

有效的Java项目69好心建议喜欢并发实用程序等待()和通知()。因此,这些方法不适用于任何类型的引用。

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

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

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

编辑:

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

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

+1

您是否检查了有效Java项目69? – Pelocho

+1

您可以使用Kotlin协同工具中的演员实施您的服务。它等待项目被发送到频道。更多信息在这里:https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md#actors – marstran

+0

您可以将任何对象强制转换为java.lang.Object,并轻松实现这些反模式。 –

回答

5

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

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


如果你真的需要使用waitnotify,例如为了在低级实现并发工具,您可以将Kotlin对象强制转换为java.lang.Object,然后调用这些函数,如the language reference中所述。或者,写成扩展功能:

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

Ad BlockingQueue,在我的情况下这是行不通的,因为通知时,我需要检查数据库中的数据。会有什么有用的吗?广告'通知',我真的不需要使用它,我只需要找到适合的东西:-) –

+0

@Vojtěch也许[信号量](https://docs.oracle.com/javase/7/docs /api/java/util/concurrent/Semaphore.html)? –