学习多线程时遇到了一点显示问题

最近正在看多线程的知识,在实际写代码的时候遇到了一些问题

  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!!!!!");
            }
        }
    }
}

img

img

第一张是把main方法里for循环的输出语句注释掉之后的结果,第二张只是把注释去掉了,我的run方法的信息呢?为什么会出现这么大的区别,我感觉脑子有点糊了,求告一下这是为什么啊。

多线程代码本身运行就充满了不确定性。

  • 第一张图,输出结果是因为你调用 start 后这个子线程没有立即执行,需要等操作系统分配时间片。等到你的 main 方法执行到 i == 90 将 flag 的值设为 false 后,子线程执行 run 就不会进入 while 了。

  • 第二张图,应该就是子线程在 stop 之前执行了,run 正常输出

  • 至于加注释导致这两者的不同,我猜测如果没有加注释,main 方法调用 System.out.println 需要耗费时间,就能够等到子线程执行。去掉注释,主线程跑的太快直接将 flag = false

TestStop 是你的主类呀,你的主类又创建了个主类,这是无限递归创建呀
你再重新写个类,让它以线程的方式执行,不要把自身再创建一遍