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