почему функция повтора в котлине отменяется - PullRequest
0 голосов
/ 04 июня 2018
fun main(args: Array<String>) = runBlocking<Unit> {
val job = launch {
    repeat(1000) { i ->
        println("I'm sleeping $i ...")
        delay(500L)
    }
}
delay(1300L) // delay a bit
println("main: I'm tired of waiting!")
job.cancel() // cancels the job
job.join() // waits for job's completion 
println("main: Now I can quit.")

} этот код не проверяет isActive или использует функцию приостановки, но может быть отменен

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Вот аналогия с потоками Java:

1) Проверка флага прерывания явно:

while (!Thread.interrupted()) {
    // loop code
}

2) Вызов прерываемых операций:

while (true) {
    Thread.sleep(1);
    // loop code
}

В обоихв случаях, когда поток будет отвечать на поднятый флаг прерывания.

В сопрограммах delay() является эквивалентом Thread.sleep(), а флаг isActive является аналогом флага Thread.interrupted.

Поэтому, когда вы пишете

delay(1)

, сопрограмма будет запланирована вне потока, и, когда придет время ее возобновления, при вызове continuation.resume() она сначала проверит флаг isActive.Если он поднят, вместо него будет CancellationException.

0 голосов
/ 04 июня 2018

Поскольку delay() является функцией приостановки.

Thread.sleep() не является функцией приостановки.Если вы замените delay(500L) на Thread.sleep(500), то он не будет отменен вовремя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...