Почему нельзя пока (flag) {} закончить - PullRequest
0 голосов
/ 21 ноября 2018

код, подобный этому:

fun main(args: Array<String>) {
var flag = true
Thread {
    Thread.sleep(2000)
    println("time over")
    flag = false
}.start()
while (flag) {
    Thread.sleep(100)
}
println("finish")
}

результат выполнения:

time over
finish

Программа завершена

, если изменить на:

fun main(args: Array<String>) {
var flag = true
Thread {
    Thread.sleep(2000)
    println("time over")
    flag = false
}.start()
while (flag) {
   //Do nothing
}
println("finish")
}

«Готово» не может быть напечатано, Программа застряла.Почему это?

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

Проблема в том, что первому потоку нужно время, чтобы установить ваш флаг в значение false, но хотя цикл выполняется до завершения потока, это означает, что ваш флаг все еще имеет значение true, так что он никогда не становится ложным.нам нужно установить поток после завершения потока, а затем проверить, когда условие для этого использует поток сна.

var flag = true
Thread {
    Thread.sleep(2000)
    println("time over")
    flag = false
}.start()
Thread.sleep(3000)
while (flag) {

}

println("finish")
0 голосов
/ 21 ноября 2018

Когда флаг переменной не объявлен volatile, компилятор иногда (зависит от используемого) оптимизирует ваш код цикла while следующим образом:

if (condition) {
    while (true) {
        // Do nothing
    }
}

Ссылка эта ссылка для большего.Вот аналогичный вопрос SO .

0 голосов
/ 21 ноября 2018

Потому что вы получаете кэшированную версию своего флага.Взгляните на ключевое слово volatile.

По сути, здесь вы обновляете флаг в одном потоке, но другой все еще видит, является ли собственная кэшированная версия флага.

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