gpt4 book ai didi

Java线程看似跳过条件语句

转载 作者:行者123 更新时间:2023-11-29 07:24:42 25 4
gpt4 key购买 nike

<分区>

对于我最近写的一个库,我写了一个无限循环的线程。在这个循环中,我从检查线程对象属性的条件语句开始。然而,似乎无论属性具有什么初始值,即使在更新后也将是它返回的值。

除非我进行某种中断,例如Thread.sleep 或打印语句。

不幸的是,我不太确定如何提出这个问题。否则我会查看 Java 文档。我已将代码归结为一个用简单的术语解释问题的最小示例。

public class App {
public static void main(String[] args) {
App app = new App();
}

class Test implements Runnable {

public boolean flag = false;

public void run() {
while(true) {

// try {
// Thread.sleep(1);
// } catch (InterruptedException e) {}

if (this.flag) {
System.out.println("True");
}
}
}

}

public App() {
Test t = new Test();
Thread thread = new Thread(t);
System.out.println("Starting thread");
thread.start();

try {
Thread.sleep(1000);
} catch (InterruptedException e) {}

t.flag = true;
System.out.println("New flag value: " + t.flag);
}
}

现在,我假设在我们更改正在运行的线程上的 flag 属性的值后,我们会立即看到大量“True”吐出到终端。然而,我们不..

如果我取消注释线程循环内的 Thread.sleep 行,程序将按预期运行,并且在我们更改 App 对象。另外,任何代替 Thread.sleep 的打印方法也有效,但一些简单的赋值代码不起作用。我认为这是因为它在编译时作为未使用的代码被提取出来。

所以,我的问题实际上是:为什么我必须使用某种中断来让线程正确检查条件?

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com