继承Runnable接口的实现类开启两个线程时候为什么无法用break跳出run方法内部的死循环

继承Runnable接口的实现类开启两个线程时候为什么无法用break跳出run方法内部的死循环

下面是继承Runnable接口的实现类,就是创建一个生产包子的线程 生产数量达到一定值会停止

public class BaoZiMarket implements Runnable {
    //创建包子参数
    private BaoZi bao;
    //定义count变量用于改变包子类型
    int count = 0;
    //定义一个包子生产的数量
    int bNum = 0;

    //创建带参构造函数
    public BaoZiMarket(BaoZi bao) {
        this.bao = bao;
    }

    @Override
    public void run() {

//创建一个死循环用来保证程序一直运行
 end:       while (true) {
//创建同步代码块
            synchronized (bao) {

//                报出线程名字
                System.out.println(Thread.currentThread().getName());
//  线程激活状态下开始生产两种包子
                if (count % 2 == 0) {
                    bao.pi = "冰皮";
                    bao.xian = "豆沙";
                    System.out.println("生产了" + bao.pi + bao.xian + "的包子");
                    // 包子生产完毕改变包子状态
                    bao.flag = true;
                } else {
                    bao.pi = "面皮";
                    bao.xian = "牛肉";
                    System.out.println("生产了" + bao.pi + bao.xian + "的包子");
                    // 包子生产完毕改变包子状态
                    bao.flag = true;
                }
                count++;
                bNum++;
// 设定生产时间 每一秒生产一个
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //                当生产数量达到3个包子则不再生产
                if (bNum == 3) {
                    break end;
                }

            }
        }
    }
}

接下来是负责运行的主类

public class CallUpMake {
    public static void main(String[] args) {
        BaoZi bao=new BaoZi();
        BaoZiMarket bm=new BaoZiMarket(bao);
        Thread t1=new Thread(bm);
        Thread t2=new Thread(bm);
        t1.start();
        t2.start();
    }
}

开启两个线程的时候run方法中用来限制的break并没有用

但是如果只开启一个线程就不会有事

public class CallUpMake {
    public static void main(String[] args) {
        BaoZi bao=new BaoZi();
        BaoZiMarket bm=new BaoZiMarket(bao);
        Thread t1=new Thread(bm);
 //     Thread t2=new Thread(bm);

        t1.start();
//        t2.start();

    }
}

这是运行结果

我知道平时线程不会用break跳 但还是想知道造成这样的原因是什么 拜托哪位大佬知道说一下 编辑器是IDEA

不是不能跳出,而且是根本就没有执行 break 语句,因为 `bNum == 3` 在你这种写法的情况下,基本上没可能会为 true。这是为什么呢,主要是因为你写了 Thread.sleep(1000); 的原因,导致只要等待完之后就都是包子数量都是偶数了,所以你写 bNum == 奇数,基本上不可能会为 true,你要是改成 bNum == 偶数的话,就能实现你想要的效果了。

 

至于为啥 Thread.sleep(1000) 执行结束,就 bNum 就都是偶数了,主要是因为你只开了两个线程,例如为 A 和 B,如果 A 先生产一个包子,然后就在 sleep() 了,接着 B 也生产了一个包子,也在 sleep() 了。等 A sleep() 结束了,其实包子的总数就是 2 了。后面就不推演了,你应该能明白了。反正只要执行到了 bNum == 3 ,包子的数量都会是偶数。

您好,我是问答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632