这样的代码:
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
无法完成“完成”,程序被卡住。为什么会这样?
答案 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。