java中Thread.sleep(1000)问题

Posted

tags:

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

如图:Thread.sleep(1000) 位置放置的不同,如何解释这两种情况呢
原本的意思是加入Thread.sleep(1000)用于降低CPU的使用率,但是开始没发现位置放错了,放在了if 里,两种情况下win7(32位)系统都可正常运行,但是后者放在 if 里在win7(64位)上出错,while始终不能结束,出现类似死锁的情况,逻辑明白,但是这个错误不明白的

你的问题,不是问sleep ,而是问 while循环和if条件判断,

第一种: 判断 hasWorkThread
a) 如果没有休眠的任务,就执行if里面的内容,break 跳出,后面的sleep不执行
b) 如果休眠的任务,就再休眠,那么循环依次后,再重复a,b,这是个死循环.

第二种:判断 hasWorkThread 如果没有休眠的任务,就让其休眠 ,然后再退出 如果有休眠的任务,直接跳到while结束位置,while不操作.
参考技术A 第一个 while 循环中, sleep(延时)在 (!pollingThradManager.getInstance().hasWorkThread())为 false 时执行。
第二个 while 循环中, sleep(延时)在(!pollingThradManager.getInstance().hasWorkThread())为 true 时执行。
假设:(!pollingThradManager.getInstance().hasWorkThread()) 为 true:
第一段代码的执行结果是赋值,然后跳出循环。
第二段代码的执行结果是赋值,延时,然后跳出循环。
假设:(!pollingThradManager.getInstance().hasWorkThread()) 为 false:
第一段代码的执行结果是延时,然后继续循环。

第一段代码的执行结果是直接继续循环。
that's the difference, I wish I can help you there.来自:求助得到的回答
参考技术A 这与系统没关系,2个while循环区别是:执行顺序改变了而已,前一个如果不进入if条件则是个死循环
后者如果如果不进入if条件也是个死循环追问

可是就在把sleep放在 if 外时,程序在64位下运行正常,郁闷在这儿

追答

理论来说,64位兼容32位jdk,那么你试下把后者放在32位系统下运行下,如果没问题,就是64位系统的事

追问

32位运行正常,只能继续调查了

追答

绝对是64位系统对32位jdk支持不够!如果不是,请通知我

追问

OK,3Q!

java Thread.sleep卡死问题

这是一个偶发问题。
在java中执行等待60秒:Thread.sleep(60*1000),
结果程序一直卡在这行代码,
在120秒后都没有执行结束。
这是什么原因?怎么解决啊?

Thread.sleep(60*1000)这个代码的意义是:程序运行到这里后,挂起1分钟,然后1分钟后程序再进入到cpu的进程队列中排队等候执行。
也就是说,这个代码无法精确控制该进程在此处恰好停留1分钟。具体的等待时间=1分钟+在排队进程中的等候时间。
你也说了这个是一个偶发问题,也就是说在特殊情况下,该进程在队列中排列的时间过长导致了等待时间很长。不过考虑到cpu的时间片大小,你等待了120秒还卡在那里的情况比较少见,可能是电脑优化不好,cpu比较老旧,开的进程特别多,导致电脑比较卡。
参考技术A sleep会把当前线程暂停运行,所以后边的代码必须等sleep结束
这也是为什么java中会有多线程,就是把sleep的东西放到一个子线程里,这样主线程就不会卡住不动了
参考技术B 你确定是卡在sleep那么?

以上是关于java中Thread.sleep(1000)问题的主要内容,如果未能解决你的问题,请参考以下文章

java Thread.sleep卡死问题

java中的thread.sleep(1000) 用法

Java问题,我同事说Thread.sleep(1000)可能会报异常,我觉得不可能啊?

for 循环中的 Java Thread.sleep()

为啥 Thread.sleep 不好用

Java中的线程的休眠Thread.sleep()