【郭林专刊】多线程知识总结线程通信,wait()与notify()的运用

 编写一个生产与消费的程序,具体要求:店主告诉生产者生产一组产品,生产者生产出之后运给店主,店主通知生产者我们这里只放得下一组产品你等等再生产,店主通知消费者取走这组产品,店主通知消费者你等等,我们这里没有产品了,店主告诉生产者生产一组产品,生产者生产出之后运给店主,店主通知生产者... ...就是这样一个运作流程(如下图所示).

代码:

  1. class ShengChan implements Runnable  
  2. {  
  3.     DianZhu d;  
  4.   
  5.     public ShengChan(DianZhu d)  
  6.     {  
  7.         this.d=d;  
  8.     }  
  9.   
  10.     public void run()  
  11.     {  
  12.         int i=0;  
  13.         while(true)  
  14.         {  
  15.             System.out.println("");//很奇怪,去掉这行就不能交替运行了,知道的网友,请赐教,谢谢.   
  16.             if(i==0)  
  17.             {  
  18.                 d.put("001","洗衣机");  
  19.             }  
  20.             else  
  21.             {  
  22.                 d.put("002","冰箱");  
  23.             }  
  24.             i=(i+1)%2;  
  25.         }  
  26.     }  
  27. }  
  28.   
  29. class XiaoFei implements Runnable  
  30. {  
  31.     DianZhu d;  
  32.     public XiaoFei(DianZhu d)  
  33.     {  
  34.         this.d=d;  
  35.     }  
  36.   
  37.     public void run()  
  38.     {  
  39.         while(true)  
  40.         {  
  41.             d.get();  
  42.         }  
  43.     }  
  44. }  
  45.   
  46.   
  47. class DianZhu  
  48. {  
  49.     private String proID="";  
  50.     private String proName="";  
  51.     private boolean isFull=false;//店主放的产品是否满了?默认为false;表示未满.   
  52.   
  53.   
  54.     public  synchronized void put(String proID,String proName)  
  55.     {  
  56.         if(isFull==false)//如果是空的.   
  57.         {  
  58.             //生产产品   
  59.             this.proID=proID;  
  60.             this.proName=proName;  
  61.             isFull=true;//产品已经生产好   
  62.         //  System.out.println(Thread.currentThread().getName()+":生产完毕!");   
  63.                     notify();//通知[消费线程]工作,注意:notify();具备有先启动,等该线程休息,才生效的特性   
  64.         }  
  65.         else//如果是满的,[生产线程]休息   
  66.         {  
  67.             //  System.out.println(Thread.currentThread().getName()+":休息!\n");   
  68.                 try{wait();}catch(Exception e){e.printStackTrace();}  
  69.         }     
  70.           
  71.     }  
  72.   
  73.     public  synchronized void get()  
  74.     {  
  75.         if(isFull==true)//如果有产品   
  76.         {  
  77.             //消费者取走产品   
  78.             System.out.println("proID:"+proID);  
  79.             System.out.println("proName:"+proName);  
  80.             isFull=false;//消费者已经取走产品   
  81.         //  System.out.println(Thread.currentThread().getName()+":取产品完毕!");   
  82.             notify();//通知[生产线程]工作   
  83.         }  
  84.         else//如果没有产品,[消费线程]休息   
  85.         {  
  86.             //          System.out.println(Thread.currentThread().getName()+":休息!\n");   
  87.                         try{wait();}catch(Exception e){e.printStackTrace();}                  
  88.         }  
  89.   
  90.   
  91.     }  
  92.   
  93. }  
  94.   
  95.   
  96. public class ShengChanLian  
  97. {  
  98.     public static void main(String[]args)  
  99.     {  
  100.         DianZhu d=new DianZhu();  
  101.         ShengChan s=new ShengChan(d);//创建对象的同时把DianZhu对象传过去   
  102.         XiaoFei x=new XiaoFei(d);  
  103.         //启动线程   
  104.         new Thread(s).start();  
  105.         new Thread(x).start();  
  106.     }  
  107. }  

输出结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值