Проблема в том, что первому потоку нужно время, чтобы установить ваш флаг в значение false, но хотя цикл выполняется до завершения потока, это означает, что ваш флаг все еще имеет значение true, так что он никогда не становится ложным.нам нужно установить поток после завершения потока, а затем проверить, когда условие для этого использует поток сна.
var flag = true
Thread {
Thread.sleep(2000)
println("time over")
flag = false
}.start()
Thread.sleep(3000)
while (flag) {
}
println("finish")