【发布时间】:2021-09-01 12:38:34
【问题描述】:
我在我的研究生项目中遇到了一个关于 java 多线程的问题。有两个线程。线程 A 将执行一个无限循环。在循环中,如果变量 simulationSwitch 为真,线程 A 会做一些事情。布尔变量 simualtionSwitch 最初设置为 false,因此线程 A 将忙于等待,直到 simualtionSwitch 设置为真的。
线程 B 处理 http 请求,并在收到 http 请求时将 SimulationSwitch 设置为 true。
让我困惑的问题来了。线程 A 不会检测到 simulationSwitch 的变化并完成它的工作。但是,如果线程 A 在其循环中调用 Thread.sleep(),如果线程 B 将 simulationSwitch 设置为 true,它可以正常工作。我真的很困惑并想弄清楚原因。
public static boolean simulationSwitch = false;
// Thread A
public void startSimulation() throws Exception {
while(true) {
Thread.sleep(1000); // without calling Thread.sleep(), thread A won't do anything even if simualtionSwitch is set to true
while (simulationSwitch) {
// do something
}
}
}
// this function will be called when receiving a specific http request
public void switchOn(){
simulationSwitch = true;
}
【问题讨论】:
-
因为即使
Thread.sleep()不需要任何内存语义,它也可以。 -
线程间信号不能使用信号量吗?
标签: java multithreading sleep