2 yuxingxing198812 yuxingxing198812 于 2017.09.11 15:14 提问

Java线程问题(有没有大神解释下,为什么下面代码是个死循环)

public class ThreadDemo {

private static boolean stopRequested;

public static void main(String args[]) throws InterruptedException {

    Thread backageThread = new Thread(new Runnable() {
        @Override
        public void run() {
            int i = 0;
            while (!stopRequested)
                i++;
        }
    });

    backageThread.start();
    TimeUnit.SECONDS.sleep(1);
    stopRequested = true;

}

}

13个回答

Fx333111
Fx333111   2017.09.11 16:01

boolean类型的初始值为false ,所以在while循环里面是出不来的,
无法执行到 TimeUnit.SECONDS.sleep(1); stopRequested = true;
你自己可以debugge 测一下

wutian842929
wutian842929   2017.09.11 15:15

因为是while啊
你换成for试试

jingweiben219
jingweiben219   2017.09.11 15:34

private static boolean stopRequested;

小布尔默认false,所以while处一直是true

loowooowool
loowooowool   2017.09.11 15:47

一直在while,没有出来,执行不到stopRequested = true;这一句

zhwyj1019
zhwyj1019   2017.09.11 16:16

backageThread.start();执行到这一句的时候会启动线程调用线程中的run()方法;此时stopRequested = true;没有执行到,布尔的默认值是false;所以是死循环了;

u013028621
u013028621   2017.09.11 16:28

你确定这是个死循环?。。。

chenxu2614
chenxu2614   2017.09.11 16:37

TimeUnit.SECONDS.sleep(1);
stopRequested = true;
说这两句没有执行的我也很费解,调用Thread 的start()方法后,循环是在另一个线程中执行的呀,为啥当前线程的后面两句会执行不到

huang931027
huang931027   2017.09.11 16:46

你设置值布尔值在生命的时候直接设置就好了,反正都是private static

zhou920786312
zhou920786312   2017.09.11 17:04

已经测试,不会死循环
public class Test1 {
private static boolean stopRequested;
public static void main(String args[]) throws InterruptedException {
Thread backageThread = new Thread(new Runnable() {
@Override
public void run() {
int i = 0;
while (!stopRequested){
i++;
System.out.println(i);
}
}
});

    backageThread.start();
    System.out.println("--backageThread-----");
    TimeUnit.SECONDS.sleep(5);
    stopRequested = true;
    System.out.println("---stopRequested----");

// 输出:
// 1
// 2
// 3
// 4
// 5
// 6
// 7
// 8
// 9
// 10
// 11
// 12
// 13
// 14
// 15
// 16
// 17
// 18
// 19
// 20
// 21
// --backageThread-----
// 22
// ---stopRequested----

}

}

chenxu2614
chenxu2614   2017.09.11 17:12

测试了下,循环里只有i++这样就不会退出,像下面这样
while (!stopRequested){
i++;
}

但把i++替换为别的,或者加个语句就可以退出了
while (!stopRequested){
System.out.println("looper i:"+i+" stopRequested:"+stopRequested);
}

很怀疑是不是因为i是个无意义的变量,编译器在编译的时候把它优化了

共13条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片