为什么while(flag){}无法结束

时间:2018-11-21 05:42:00

标签: java kotlin

这样的代码:

procedure Tfrm1.IWAppFormCreate(Sender: TObject);
begin
  IWURL1.OnAsyncClick := IWURL1AsyncClick;
end;

procedure Tfrm1.IWURL1AsyncClick(Sender: TObject; EventParams: TStringList);
begin
  //execute code
end;

运行结果是:

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

无法完成“完成”,程序被卡住。为什么会这样?

3 个答案:

答案 0 :(得分:5)

因为您正在获取标志的缓存版本。看看volatile关键字。

基本上,这里是在一个线程中更新标志,而另一个仍在查看标志的自身缓存版本。

答案 1 :(得分:0)

问题是第一个线程需要时间来设置您的标志为false,但是在线程完成之前执行循环,这意味着您的标志仍然为true,因此它永远不会为假。 我们需要在线程完成后设置流量,然后检查该线程休眠的条件。

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

}

println("finish")

答案 2 :(得分:0)

当未声明变量标志volatile时,编译器有时(取决于所使用的那个)将while循环代码优化为以下内容:

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

更多信息请参考this link。这是similar SO question