Java多线程和Thread.sleep [重复]
Posted
技术标签:
【中文标题】Java多线程和Thread.sleep [重复]【英文标题】:Java multithread and Thread.sleep [duplicate] 【发布时间】: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()
不需要任何内存语义,它也可以。
线程间信号不能使用信号量吗?
【参考方案1】:
为确保跨线程的更改可见,simulationSwitch
应声明为 volatile
。
如果没有 volatile,那么在某些情况下更改仍然是可见的,但您不能依赖它。
【讨论】:
它有帮助。谢谢!以上是关于Java多线程和Thread.sleep [重复]的主要内容,如果未能解决你的问题,请参考以下文章