2017-06-16 60 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)? –