java 线程sleep 疑问

ghqJAVA 2017-08-01 07:47:46

为什么把Thread.sleep(500);放在if(!stop)语句块内会造成死循环,cpu爆满呢?而把Thread.sleep(500)放在while(true)语句块内就
正常了呢?
class Twinkle extends Thread{
boolean stop=true;

public void run(){

int which=0;
while(true){
if(!stop){
if(which==0){
which=1;
//trayIcon.setImage(ImageAndUIFactory.trayYellow);
}
else{
which=0;
//trayIcon.setImage(ImageAndUIFactory.trayWhite);
}
}
else{
//trayIcon.setImage(ImageAndUIFactory.trayYellow);
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}

}
...全文
217 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jcon_ 2017-08-03
  • 打赏
  • 举报
回复
Thread.sleep(500);放在if(!stop)内,因为!stop=false,所以不会执行if内的代码,也就是说没有执行Thread.sleep(500);这段代码。此时相当于是while(true){}一直死循环在执行。放在while(true)语句块内的时候是执行到了Thread.sleep(500);这段代码,相当于是每隔0.5s就执行一次。
潇湘如梦 2017-08-02
  • 打赏
  • 举报
回复
不管sleep放在哪儿,lz你的代码都会死循环,只不过,如果sleep放在if(!stop)语句块内,由于stop=true始终成立,因此if(!stop)永远进不去,此时while循环中没有任何等待过程,因此会迅速循环无数次。但是如果将sleep放在if(!stop)语句块外面,那么由于每次循环都会有0.5秒等待,所以cpu资源不会那么快消耗完。因此lz看到的只不过是正在不断消耗cpu的过程中,只要再稍微等待一会儿,或者将sleep时间设置小一点,比如sleep(1),那么lz会发现不管sleep放在那儿都会迅速消耗完cpu资源。
soton_dolphin 2017-08-01
  • 打赏
  • 举报
回复
把你的代码再整理整理

62,626

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧