星刻流年 2022-09-23 17:23 采纳率: 28.6%
浏览 26
已结题

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

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

  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方法的信息呢?为什么会出现这么大的区别,我感觉脑子有点糊了,求告一下这是为什么啊。

  • 写回答

2条回答 默认 最新

  • aabond 2022-09-23 18:01
    关注

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

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

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月1日
  • 已采纳回答 9月23日
  • 创建了问题 9月23日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度