Котлин сопрограммы последовательного исполнения - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь создать объект, который может выполнять некоторые задачи последовательно в своем собственном потоке, как будто это очередь.

Следующий пример только для демонстрации моей настройки и может быть совершенно неверным.

class CoroutinesTest {
    fun a() {
        GlobalScope.launch {
            println("a started")
            delay(1000)
            println("a completed")
        }
    }

    fun b() {
        GlobalScope.launch {
            println("b started")
            delay(2000)
            println("b completed")
        }
    }

    fun complex() {
        a()
        b()
    }
}

fun main() {
    runBlocking {
        val coroutinesTest = CoroutinesTest()

        coroutinesTest.complex()

        delay(10000)
    }
}

На данный момент этот код печатает следующее

a started
b started
a completed
b completed

, что означает a и b выполняются параллельно.Методы a, b и complex могут вызываться из разных потоков.Конечно, метод complex также должен поддерживать эту концепцию.На данный момент мне нужен механизм, который позволяет мне выполнять только одну задачу за раз, поэтому я мог получить следующий вывод:

a started
a completed
b started
b completed

Я провел некоторое исследование и думаю, что actor с Channel может делать то, что нужно, но actor на данный момент помечено как устарело ( проблема # 87 ).Мне не нравится идея использования API, который может быть изменен, поэтому я хотел бы сделать это обычным способом.

...