foreach kotlin ожидание интервалов для отслеживания потока - PullRequest
0 голосов
/ 18 апреля 2020

Может ли кто-нибудь помочь мне в следующем: у меня есть FOR, и внутри него я запускаю несколько TIMERS

Я хочу, чтобы изначально он запускал TIMER для первого индекса и только после отмены таймера метод go до следующего таймера. мой FOR должен будет ждать завершения таймера.

for (i in 1..3) {
    println("running for loop: $i")

    val interval: Long = 60 * 1000 * 1 // 1 minute
    val timer = Timer("timer: $i", true)
    timer.schedule(100, interval) {
        println("${LocalTime.now()} to loop: $i")
        // some logic here do stop the timer
        // if (something happens) timer.cancel()
    }
}

мой вывод

running for loop: 1
running for loop: 2
running for loop: 3
18:34:57.147132900 to loop: 2
18:34:57.147132900 to loop: 3
18:34:57.147132900 to loop: 1
18:35:57.137764800 to loop: 3
18:35:57.137764800 to loop: 2
18:35:57.137764800 to loop: 1
etc...

мой вывод, как я надеюсь, будет

running for loop: 1
18:34:57.147132900 to loop: 1
18:35:57.147132900 to loop: 1
18:36:57.147132900 to loop: 1
18:37:57.147132900 to loop: 1
running for loop: 2
18:38:57.147132900 to loop: 2
18:39:57.147132900 to loop: 2
running for loop: 3
18:40:57.147132900 to loop: 3
18:41:57.147132900 to loop: 3
18:42:57.147132900 to loop: 3

1 Ответ

0 голосов
/ 20 апреля 2020

У меня есть FOR, и внутри него я запускаю несколько TIMERS

Это неверное утверждение, java .util.Timer - это служебный класс, который можно использовать для планирования потока будет выполняться в определенное время в будущем.

timer.schedule(100, interval) {}

Приведенная выше строка не блокирует для l oop, таймер запланирован для запуска в потоке, а для l oop продолжается выполните следующую итерацию.


Вероятно, вам нужно блокирующее решение, чтобы выполнить их один за другим

for (i in 1..3) {
    println("running for loop: $i")

    val interval: Long = 60 * 1000 * 1 // 1 minute
    Thread.sleep(100)
    var isRunning = true
    while(isRunning) {
        println("${LocalTime.now()} to loop: $i")
        Thread.sleep(interval)
        // some logic here do stop the timer
        // if (something happens) isRunning = false
    }
}

Но, вероятно, это не лучшая практика, поскольку ваш поток просто заблокировав, вы можете использовать сопрограммы для этого, не тратя свои системные ресурсы, блокируя потоки:

fun main() = runBlocking {
    launch {
        for (i in 1..3) {
            println("running for loop: $i")

            val interval: Long = 60 * 1000 * 1 // 1 minute
            delay(100)
            var isRunning = true
            while(isRunning) {
                println("${LocalTime.now()} to loop: $i")
                delay(interval)
                // some logic here do stop the timer
                // if (something happens) isRunning = false
            }
        }
    }
    // ...
    // do sth in main without blocking, these all things run on same thread
    // none of the code is blocked
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...