等待唤醒机制代码实现
包子类:
public class BaoZi { String pi; String xian; boolean flag = false; }
包子铺类:
public class BaoZiPu extends Thread{ private BaoZi bz; public BaoZiPu(BaoZi bz) { this.bz = bz; } //设置线程任务(run):吃包子 @Override public void run() { int count=0; //让包子铺,一直生产包子 while (true){ //必须同时同步技术,保证两个线程只能有一个在执行 synchronized (bz){ //对包子的状态进行判断 if(bz.flag==true){ //包子铺调用wait方法进入等待状态 try { bz.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //被唤醒之后执行:包子铺生产包子 //交替生产两种包子 if (count%2==0){ bz.pi = "薄皮"; bz.xian = "三鲜馅"; }else { bz.pi = "冰皮"; bz.xian = "牛肉大葱馅"; } count++; System.out.println("包子铺正在生产"+bz.pi+bz.xian+"包子"); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } //包子铺生产好了包子,修改包子的状态为true bz.flag = true; //唤醒吃货线程,让吃货线程吃包子 bz.notify(); System.out.println("包子已经生产好了"+bz.pi+bz.xian+"可以开吃了"); } } } }
吃货类:
public class ChiHuo extends Thread{ private BaoZi bz; public ChiHuo(BaoZi bz) { this.bz = bz; } //设置线程任务(run):吃包子 @Override public void run() { //使用死循环,让吃货一直吃包子 while (true){ //必须同时同步技术,保证两个线程只能有一个在执行 synchronized (bz){ //对包子的状态进行判断 if (bz.flag==false){ //吃货调用wait方法进入等待状态 try { bz.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //被唤醒之后执行的 代码 System.out.println("吃货正在吃:"+bz.pi+bz.xian+"的"); //吃货吃完包字修改包子的状态为false bz.flag = false; //吃货唤醒包子铺线程,生产包子 bz.notify(); System.out.println("吃货已经把"+bz.pi+bz.xian+"的包子吃完了,包子铺开始生产包子"); System.out.println("================"); } } } }
测试类:
public class Demo { public static void main(String[] args) { BaoZi bz = new BaoZi(); new BaoZiPu(bz).start(); new ChiHuo(bz).start(); } }
运行结果:

 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号