码迷,mamicode.com
首页 > 编程语言 > 详细

线程之间的相互通信

时间:2016-07-09 01:58:46      阅读:310      评论:0      收藏:0      [点我收藏+]

标签:

  1 /*
  2  线程的通信,互相调用 两个线程
  3  需求:  生产者  消费者 , 生产一个产品   就消费一个产品 , 产品是共享的
  4 
  5 
  6  */
  7 //产品类
  8 class Product{
  9     
 10     String name;  //名字
 11     
 12     double price;  //价格
 13     
 14     boolean flag = false; //产品是否生产完毕的标识,默认情况是没有生产完成。
 15     
 16 }
 17 
 18 //生产者
 19 class Producer extends Thread{
 20     
 21     Product  p ;      //产品
 22     
 23     public Producer(Product p) {
 24         this.p  = p ;
 25     }
 26     
 27     @Override
 28     public void run() {
 29         int i = 0 ; 
 30         while(true){
 31          synchronized (p) {
 32             if(p.flag==false){
 33                  if(i%2==0){
 34                      p.name = "苹果";
 35                      p.price = 6.5;
 36                  }else{
 37                      p.name="香蕉";
 38                      p.price = 2.0;
 39                  }
 40                  System.out.println("生产者生产出了:"+ p.name+" 价格是:"+ p.price);
 41                  p.flag = true;
 42                  i++;
 43                  p.notifyAll(); //唤醒消费者去消费
 44             }else{
 45                 //已经生产 完毕,等待消费者先去消费
 46                 try {
 47                     p.wait();   //生产者等待
 48                 } catch (InterruptedException e) {
 49                     e.printStackTrace();
 50                 }
 51             }
 52              
 53         }    
 54       }    
 55     }
 56 }
 57 
 58 
 59 //消费者
 60 class Customer extends Thread{
 61     
 62     Product p; 
 63     
 64     public  Customer(Product p) {
 65         this.p = p;
 66     }
 67     
 68     @Override
 69     public void run() {
 70         while(true){
 71             synchronized (p) {    
 72                 if(p.flag==true){  //产品已经生产完毕
 73                     System.out.println("消费者消费了"+p.name+" 价格:"+ p.price);
 74                     p.flag = false; 
 75                     p.notifyAll(); // 唤醒生产者去生产
 76                 }else{
 77                     //产品还没有生产,应该 等待生产者先生产。
 78                     try {
 79                         p.wait(); //消费者也等待了...
 80                     } catch (InterruptedException e) {
 81                         e.printStackTrace();
 82                     }
 83                 }
 84             }
 85         }    
 86     }
 87 }
 88 
 89 
 90 public class Demo9 {
 91 
 92     public static void main(String[] args) {
 93         Product p = new Product();
 94         Producer pr = new Producer(p);
 95         Customer c = new Customer(p);
 96         pr.start();
 97         c.start();
 98 
 99     }
100 
101 }

 

线程之间的相互通信

标签:

原文地址:http://www.cnblogs.com/bequt/p/5655043.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!