notify方法只是唤醒了其他线程并不代表能立马切换到其他线程里面,没有死循环的条件下此线程运行结束才会轮到其他线程执行,有死循环的条件下遇见wait方法才会进入等待状态立马跳出执行其他线程 以下代码 自己写的参考参考
创建共享数据类 也是锁对象里面的内容提前设置好
public class FuXi2 {//创建共享数据 顾客和包子铺都需要这些数据
String xian;
String pi;
boolean hava=false;
}
创建顾客线程
//顾客线程
//注意:|||代表分割线
public class FuXi3 extends Thread {
private FuXi2 fuXi2;//引用类型 定义一个变量把这个对象类里面的数据方法引用过来,同时作为锁对象
public FuXi3(FuXi2 fuXi2) {//放入指定类型的数据
this.fuXi2 = fuXi2;//设定本类引用数据类型变量为放入的指定引用数据类型变量
}
@Override
public void run() {
while (true){//注意这里是个死循环 不经过wait方法不会停止|||死循环第二次执行
synchronized (fuXi2) {//设置线程安全问题 一个一个线程执行下列方法 锁对象为fuxi2 |||第二次执行
System.out.println("来两个包子");
try {
fuXi2.wait();//进入等待切换包子铺|||第二次执行
} catch (InterruptedException e) {
e.printStackTrace();
}
try {//从上往下执行没有其他线程可以执行。于是此线程开始执行|||第二次执行
Thread.sleep(2000);//等待2秒钟|||第二次执行
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(fuXi2.xian+fuXi2.pi+"的包子吃到了味道不错");//
fuXi2.hava=false;//吃掉了包子 设置包子为false值 因为包子没有了|||第二次执行
fuXi2.notifyAll();//释放所有线程都可执行|||第二次执行
}
}
}
}
创建包子铺线程
//切换包子铺
public class Person extends Thread {
private FuXi2 fuXi2;//引用类型 定义一个变量把这个对象类里面的数据方法引用过来,同时作为锁对象
public Person(FuXi2 fuXi2) {//放入指定类型的数据
this.fuXi2 = fuXi2;//设定本类引用数据类型变量为放入的指定引用数据类型变量
}
@Override
public void run() {//店铺生产包子
int a = 0;
synchronized (fuXi2) {//设置线程安全问题 一个一个线程执行下列方法 锁对象为fuxi2
while (true) {//注意这里是个死循环 不经过wait方法不会停止 ||| 又一轮循环此时包子铺为true有包子了
if (fuXi2.hava == false) {//判断包子铺是否没有包子
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (a % 2 == 0) {//没有包子执行下面代码
fuXi2.xian = "三鲜馅";//套餐1
fuXi2.pi = "饺子皮";
} else if (a % 2 == 1) {//套餐2
fuXi2.xian = "韭菜馅";
fuXi2.pi = "馄饨皮";
}
System.out.println("正在生产您所需要的包子");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
fuXi2.hava = true;//做好了有包子了 设置包子库存为true
a++;//随机套餐索引+1
fuXi2.notify();//解锁另一个等待的线程
System.out.println(fuXi2.xian + fuXi2.pi + "的包子做好了");
} else try {//有包子的话执行|||执行此代码
fuXi2.wait();//进入等待线程其他线程执行|||从上往下执行没有其他线程可以执行,于是此线程开始执行,并且由于其他线程已经释放锁对象 所以继续执行下方代码
System.out.println("早就准备好了给您");//打印结果告知顾客
fuXi2.notify();//唤醒某个等待时间长的线程
fuXi2.wait();//进入等待状态 其他线程执行
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
测试类开始测试
public class FuXi4 extends Thread {
public static void main(String[] args) {
FuXi2 a = new FuXi2();
Person a1 = new Person(a);
FuXi3 a2 = new FuXi3(a);
a2.start();//运行多线程执行run方法
a1.start();//运行多线程执行run方法
}
}