Correctamente implementando esperar y notificar en Kotlin

Según este documento, no se wait utilizar wait and notify en Kotlin: https://kotlinlang.org/docs/reference/java-interop.html

wait () / notify ()

El artículo 69 eficaz de Java sugiere gentilmente que prefiera las utilidades de concurrency a wait () y notify (). Por lo tanto, estos methods no están disponibles en las references de tipo Cualquiera.

Sin embargo, el documento no propone ninguna forma correcta de hacerlo.

Básicamente, me gustaría implementar un service que lea los datos de input y los procese. Si no hubiera datos de input, se suspendería hasta que alguien notifique que hay nuevos datos de input. Algo como

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

EDITAR:

No quiero utilizar estos methods no recomendados (antipatrones), realmente quiero saber cómo hacerlo correctamente.

En mi caso, fetchData lee datos de la database, por lo que las queues en mi caso no se pueden usar.

Un BlockingQueue puede ser una utilidad de concurrency de alto nivel adecuada para su caso de uso, pero aplicarlo requiere conocer y modificar la estructura de su código.

La idea es que fetchData() debe .take() un elemento de la queue, y si la queue está vacía, eso bloqueará la ejecución hasta que aparezca un elemento, lo que elimina el .wait() en el código. El productor de los datos debe .put(t) los datos en la queue.


Si realmente necesita usar wait and notify , por ejemplo para implementar una utilidad de concurrency a bajo nivel, puede lanzar un object Kotlin a java.lang.Object y llamar a estas funciones después, como se indica en la reference del lenguaje . O, escrito como funciones de extensión:

 @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") private fun Any.wait() = (this as java.lang.Object).wait() 
  • ¿Cómo obtengo el valor de una propiedad con reflection?
  • Error del adaptador ExpandableListView en Kotlin
  • ¿Hay alguna manera de exigir que un tipo genérico sea una class de datos en Kotlin?
  • ¿Hay alguna forma de cargar las bibliotecas de time de ejecución además de ponerlas en src / main / jniLibs?
  • Referencia no resuelta de Kotlin: println de gradle en la CLI
  • NoSuchMethodError usando @Parcelize Annotation en Kotlin
  • kotlin-android null no se puede convertir a tipo no nulo kotlin.String
  • Kotlin con stack RxKotlinFX da un error de class de acceso
  • Tamaño de file grande al convertir bitmap a PDF
  • Llamadas encadenadas y inheritance
  • ¿Cómo agrupar elementos del Arraylist of time en HashMap en Kotlin?