最近正在看多线程的知识,在实际写代码的时候遇到了一些问题
public class TestStop implements Runnable{
//设置标志位
private boolean flag = true;
@Override
public void run() {
int i = 0;
while(flag){
System.out.println("run....."+i++);
}
}
public void stop(){
this.flag = false;
}
public static void main(String[] args) {
TestStop testStop = new TestStop();
new Thread(testStop).start();
for (int i = 0; i < 100; i++) {
//System.out.println("====="+i);
if (i == 90){
testStop.stop();
System.out.println("stop!!!!!");
}
}
}
}
第一张是把main方法里for循环的输出语句注释掉之后的结果,第二张只是把注释去掉了,我的run方法的信息呢?为什么会出现这么大的区别,我感觉脑子有点糊了,求告一下这是为什么啊。
多线程代码本身运行就充满了不确定性。
第一张图,输出结果是因为你调用 start 后这个子线程没有立即执行,需要等操作系统分配时间片。等到你的 main 方法执行到 i == 90 将 flag 的值设为 false 后,子线程执行 run 就不会进入 while 了。
第二张图,应该就是子线程在 stop 之前执行了,run 正常输出
至于加注释导致这两者的不同,我猜测如果没有加注释,main 方法调用 System.out.println 需要耗费时间,就能够等到子线程执行。去掉注释,主线程跑的太快直接将 flag = false
TestStop 是你的主类呀,你的主类又创建了个主类,这是无限递归创建呀
你再重新写个类,让它以线程的方式执行,不要把自身再创建一遍