克里斯开门QAQ 2021-03-27 13:03 采纳率: 0%
浏览 108

继承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

  • 写回答

2条回答 默认 最新

  • 三岁丫 2021-03-27 21:20
    关注

    不是不能跳出,而且是根本就没有执行 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 ,包子的数量都会是偶数。

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题