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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程编程里的thread.sleep问题相关的知识,希望对你有一定的参考价值。

看别人的代码里,多线程编程经常用到thread.sleep().但是具体睡多长时间,什么时候睡好像没有固定章法.有的甚至使用了thread.sleep(3);我的疑问是一般情况下应该在何时机使用它.如果不使用的话会不会对最终结果造成影响?(不考虑性能问题)

thread.sleep(0) 或3,只是让CPU能切换下时间片,有机会腾出CPU让别人执行。
window的计时最小是以15ms做为单位的,以15ms递增的,所以可以有15,30,45,15倍数的精度,而且是在上下浮动,设为30可能是15,可能是45(主要看cpu忙不忙)。
参考技术A sleep方法就是让线程等待的, 给予的参数一般都是毫秒的单位, 比如等待1秒就是Thread.Sleep(1000);
在使用动画效果的时候, 这个方法很常用, 因为很多动画效果都是通过循环完成的, 如果不用Sleep进行延时等待的话, 那个效果基本上就是闪了一下; 还有的是因为要等待另一项工作(通常也是另一个线程)完成以后, 这个线程再继续进行, 这个时候就可以先Sleep一阵, 然后检测是否完成, 没完成再Sleep, 直到完成以后再继续运行本回答被提问者和网友采纳

Java多线程和Thread.sleep [重复]

【中文标题】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,那么在某些情况下更改仍然是可见的,但您不能依赖它。

【讨论】:

它有帮助。谢谢!

以上是关于多线程编程里的thread.sleep问题的主要内容,如果未能解决你的问题,请参考以下文章

多线程异步编程示例和实践-Thread和ThreadPool

多线程概念与编程

Thread.sleep的意义& 多线程

Thread.sleep的意义& 多线程详解

Thread.sleep的意义& 多线程详解

Java多线程java中的Sleep方法