Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

448
Visualizações
Cómo suspender la rutina de Kotlin hasta que se notifique

Me gustaría suspender una rutina de Kotlin hasta que se llame a un método desde el exterior, al igual que los antiguos métodos Java object.wait() y object.notify(). ¿Cómo puedo hacer eso?

Aquí: Implementar correctamente esperar y notificar en Kotlin es una respuesta sobre cómo implementar esto con hilos de Kotlin (bloqueo). Y aquí: Suspender la rutina hasta que la condición sea verdadera es una respuesta sobre cómo hacer esto con CompleteableDeferreds, pero no quiero tener que crear una nueva instancia de CompleteableDeferred cada vez.

Estoy haciendo esto actualmente:

 var nextIndex = 0 fun handleNext(): Boolean { if (nextIndex < apps.size) { //Do the actual work on apps[nextIndex] nextIndex++ } //only execute again if nextIndex is a valid index return nextIndex < apps.size } handleNext() // The returned function will be called multiple times, which I would like to replace with something like notify() return ::handleNext

De: https://gitlab.com/SuperFreezZ/SuperFreezZ/blob/master/src/superfreeze/tool/android/backend/Freezer.kt#L69

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Los canales se pueden usar para esto (aunque son más generales):

Cuando la capacidad es 0, crea RendezvousChannel. Este canal no tiene ningún búfer en absoluto. Un elemento se transfiere del remitente al receptor solo cuando las invocaciones de enviar y recibir se encuentran a tiempo (rendezvous), por lo tanto, el envío se suspende hasta que otra corrutina invoca a recibir y la recepción se suspende hasta que otra corrutina invoca a enviar.

Así que crea

 val channel = Channel<Unit>(0)

Y use channel.receive() para object.wait() , y channel.offer(Unit) para object.notify() (o send si desea esperar hasta que la otra rutina receive s).

Para notifyAll a Todos, puede usar BroadcastChannel en su lugar.

Por supuesto, puede encapsularlo fácilmente:

 inline class Waiter(private val channel: Channel<Unit> = Channel<Unit>(0)) { suspend fun doWait() { channel.receive() } fun doNotify() { channel.offer(Unit) } }
over 4 years ago · Santiago Trujillo Relatório

0

Es posible usar la función básica suspendCoroutine{..} para eso, por ejemplo

 class SuspendWait() { private lateinit var myCont: Continuation<Unit> suspend fun sleepAndWait() = suspendCoroutine<Unit>{ cont -> myCont = cont } fun resume() { val cont = myCont myCont = null cont.resume(Unit) } }

Está claro, el código tiene problemas, por ejemplo, el campo myCont no está sincronizado, se espera que se sleepAndWait antes de la resume y así sucesivamente, espero que la idea esté clara ahora.

Hay otra solución con la clase Mutex de la biblioteca kotlinx.coroutines.

 class SuspendWait2 { private val mutex = Mutex(locaked = true) suspend fun sleepAndWait() = mutex.withLock{} fun resume() { mutex.unlock() } }
over 4 years ago · Santiago Trujillo Relatório

0

Sugiero usar un CompletableJob para eso.

Mi caso de uso:

 suspend fun onLoad() { var job1: CompletableJob? = Job() var job2: CompletableJob? = Job() lifecycleScope.launch { someList.collect { doSomething(it) job1?.complete() } } lifecycleScope.launch { otherList.collect { doSomethingElse(it) job2?.complete() } } joinAll(job1!!, job2!!) // suspends until both jobs are done job1 = null job2 = null // Do something one time }
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda