Сопрограммы: есть ли способ заблокировать несколько выполнений и уведомить их всех? - PullRequest
0 голосов
/ 08 мая 2019

Я пытался реализовать систему wait & notifyAll, как я делал в Java.Основная идея состоит в том, чтобы вызвать несколько функций для ожидания сигнала и продолжения их выполнения.

Следующий тестовый сценарий оборачивает предполагаемую реализацию:

@Test
fun blocking_multiple_shouldReturnOne() {
    var valueOne : Int? = null
    var valueTwo : Int? = null
    var valueThree : Int? = null
    var valueFour : Int? = null

    val threadManager = ThreadManager()

    threadManager.startBlocking { 
        valueOne = 1
    }

    threadManager.startBlocking {
        valueTwo = 1
    }

    threadManager.startBlocking {
        valueThree = 1
    }

    threadManager.startBlocking {
        valueFour = 1
    }

    threadManager.startAndNotifyAll {
        valueOne = 0
        valueTwo = 0
        valueThree = 0
        valueFour = 0
    }

    assertTrue("startBlocking wasn't executed right after notify all", valueOne == 1)
    assertTrue("startBlocking wasn't executed right after notify all", valueTwo == 1)
    assertTrue("startBlocking wasn't executed right after notify all", valueThree == 1)
    assertTrue("startBlocking wasn't executed right after notify all", valueFour == 1)
}

Есть ли способ сделать это, используяСопрограммы в Котлине?Пока что не везет исследовать.

Заранее спасибо.

1 Ответ

0 голосов
/ 08 мая 2019

Да, вы можете.Сделайте все ваши функции приостановленными и затем вызовите их все из блока запуска.Это будет так

suspend fun fun1() {
  println("some async 1")
}

suspend fun fun2() {
  println("some async 2")
}

suspend fun fun3() {
  println("some async 3")
}

CoroutineScope(Dispatchers.Default).launch {
    fun1()
    fun2()
    fun3()
}

Результат будет

some async 1
some async 2
some async 3
...