El interruptor del hombre muerto en Kotlin

Quiero implementar un interruptor de hombre muerto en Kotlin. Lo que hace es disparar una notificación TIME_INTERVAL segundos después de que se recibió el último MyEvent . Cuando se recibe un nuevo MyEvent , reinicia el timer.

 private val stopWatch = object : () -> Unit { var timer = System.currentTimeMillis() var isRunning = false override fun invoke() { timer = System.currentTimeMillis() if (isRunning) return synchronized(this) { isRunning = true while (System.currentTimeMillis() - timer <= TIME_INTERVAL) {} fireNotification() isRunning = false } } } override fun onSomeEvent(e: MyEvent?) { runAsync(stopWatch) } 

¿Existe alguna manera más simple o más sencilla de get esta funcionalidad mediante el uso de las bibliotecas estándar kotlin.concurrent o Java?

Si entiendo correctamente, su código consiste en hacer un bucle sin hacer nada hasta que haya transcurrido el intervalo de time. Esta es una mala idea, ya que consume una gran cantidad de CPU sin hacer nada, en lugar de simplemente esperar.

Usaría un ScheduledExecutr para progtwigr la activación de la notificación. Y cancelaría el futuro devuelto cuando llegue un evento antes de que se active la notificación:

 import java.time.Instant.now import java.util.concurrent.Executors import java.util.concurrent.ScheduledFuture import java.util.concurrent.TimeUnit class StopWatch { private var future: ScheduledFuture<Void>? = null; private val executor = Executors.newSingleThreadScheduledExecutor() fun onSomeEvent() { synchronized(this) { future.let { future?.cancel(false) future = null } val command = { synchronized(this@StopWatch) { future = null } fireNotification() null } future = executor.schedule(command, 2, TimeUnit.SECONDS) } println("${now()} - event") } private fun fireNotification() { println("${now()} - notification") } fun shutdown() { executor.shutdown() } } fun main(args: Array<String>) { val stopWatch = StopWatch() stopWatch.onSomeEvent() Thread.sleep(1000) stopWatch.onSomeEvent() Thread.sleep(1000) stopWatch.onSomeEvent() Thread.sleep(1000) stopWatch.onSomeEvent() Thread.sleep(3000) stopWatch.onSomeEvent() stopWatch.shutdown() } 

Que impresiones:

 2017-05-07T12:45:55.647Z - event 2017-05-07T12:45:56.741Z - event 2017-05-07T12:45:57.743Z - event 2017-05-07T12:45:58.745Z - event 2017-05-07T12:46:00.747Z - notification 2017-05-07T12:46:01.750Z - event 2017-05-07T12:46:03.753Z - notification 
  • ¿Cambiar notifications en Realm para objects internos?
  • Spring WebFlux y Kotlin Support: ¿Cómo hacer testings de integración?
  • Kotlin construye causando JVM a la falla de segmentación
  • ¿Cómo solucionar este error en la demostración web de Kotlin?
  • ¿Cómo ejecutar la class Kotlin desde la línea de command?
  • ¿Cómo puedo convertir InputStream en BufferInputStream en kotlin?
  • RxJava2: onComplete no llamado con flatMapIterable
  • Reproducción solo del audio 1, no 2, 3 y 4
  • Usar con autoclose en Kotlin
  • kotlin, ¿Cómo se puede cambiar el valor de la variable real en otra class a la que pasó mediante el parámetro?
  • Repetir y crear una database desde el volcado sql: cómo hacerlo?