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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程java中的Sleep方法

Java:关于Thread.sleep()

java Thread.sleep卡死问题

多线程编程里的thread.sleep问题

java 实现等待时间

Thread.sleep(1)为啥不起作用?请高手帮忙分析!