Chinaunix首页 | 论坛 | 博客
  • 博客访问: 280752
  • 博文数量: 28
  • 博客积分: 11
  • 博客等级: 民兵
  • 技术积分: 895
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-19 19:50
个人简介

不畏浮云遮望眼,只缘身在最高层

文章分类

全部博文(28)

文章存档

2014年(1)

2013年(27)

分类: Java

2013-03-11 10:34:56


点击(此处)折叠或打开

  1. import java.util.concurrent.locks.Lock;
  2. import java.util.concurrent.locks.ReentrantLock;
  3. import java.util.concurrent.locks.Condition;

  4. /*
  5.  * 生产者消费者问题
  6.  * 两个个生产者,两个消费者,生产一个,消费一个。
  7.  * 实际生活当中一般是多个生产者,多个消费者的情况
  8.  *
  9.  * JDK1.5中提供了多线程升级解决方案
  10.  * 将同步的Synchronized 替换成现实的lock操作
  11.  * 将Object中的wait()、notify()、notifyAll(),替换为Condition对象
  12.  * Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,
  13.  * 以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set(wait-set)。
  14.  * 其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。
  15.  * Condition 实例实质上被绑定到一个锁上。要为特定 Lock 实例获得 Condition 实例,
  16.  * 该对象可以进行Lock锁,进行获取
  17.  * 该实例中,实现了本方唤醒对方的操作
  18.  *
  19.  *
  20.  * * */


  21. public class UpgradeProduce {

  22.     public static void main(String[] args) {
  23.         
  24.         Factory f=new Factory(); //创建一个工厂
  25.         Thread t1=new Thread(new Produce(f)); //生产者A
  26.         Thread t11=new Thread(new Produce(f));//生产者B
  27.         Thread t2=new Thread(new Consume(f)); //消费者A
  28.         Thread t22=new Thread(new Consume(f)); //消费者B
  29.         
  30.         t1.start(); //生产者A 准备生产
  31.         t11.start();//生产者B 准备生产
  32.         t2.start(); //消费者A 准备消费
  33.         t22.start();//消费者B 准备消费
  34.         
  35.     }

  36. }

  37. class Factory //生产车间
  38. {
  39.     private String name;
  40.     private int count=1; //商品编号
  41.     private boolean flag=false; //标志位,
  42.     
  43.     private Lock lock=new ReentrantLock(); //创建Lock实例
  44.     private Condition condition_pro=lock.newCondition(); //生产者监视器
  45.     private Condition condition_con=lock.newCondition(); //消费者监视器
  46.         
  47.     public void set(String name) //生产商品
  48.     {
  49.         lock.lock();
  50.         try{
  51.             while(flag) //如果生产了一个 ,生产者就等待
  52.              condition_pro.await();
  53.             this.name=name+"--->"+count++;
  54.             System.out.println(Thread.currentThread().getName()+"-生产者-"+this.name);
  55.             flag=true;
  56.             condition_con.signal(); //唤醒消费者开始消费
  57.          }
  58.         catch(InterruptedException e){e.printStackTrace();}
  59.         finally//释放锁
  60.         {
  61.             lock.unlock();
  62.         }
  63.             
  64.     }
  65.     public void out() //消费商品
  66.     {
  67.         lock.lock();
  68.         try
  69.         {
  70.             while(!flag) //如果消费了一个,消费者就等待,
  71.              {condition_con.await();}
  72.             System.out.println(Thread.currentThread().getName()+" -消费者- "+this.name);
  73.             flag=false;
  74.             condition_pro.signal(); //唤醒生产者继续生产
  75.          }
  76.         catch(InterruptedException e){e.printStackTrace();}
  77.         finally //释放锁
  78.         {
  79.             lock.unlock();
  80.         }
  81.         
  82.     }
  83.         
  84. }

  85. class Produce implements Runnable //生产者线程
  86. {
  87.      private Factory f;
  88.      public Produce(Factory f)
  89.      {
  90.          this.f=f;
  91.      }
  92.      public void run()
  93.      {
  94.          while(true)
  95.          f.set("=商品=");//开始生产
  96.      }
  97. }
  98.  
  99. class Consume implements Runnable //消费者线程
  100. {
  101.     private Factory f;
  102.     public Consume(Factory f)
  103.     {
  104.         this.f=f;
  105.     }
  106.     public void run()
  107.     {
  108.         while(true)
  109.         f.out(); //消费
  110.     }
  111. }


运行结果:
Thread-1-生产者-=商品=--->34317
Thread-3  -消费者-  =商品=--->34317
Thread-0-生产者-=商品=--->34318
Thread-3  -消费者-  =商品=--->34318
Thread-1-生产者-=商品=--->34319
Thread-3  -消费者-  =商品=--->34319
Thread-0-生产者-=商品=--->34320
Thread-3  -消费者-  =商品=--->34320
Thread-1-生产者-=商品=--->34321
Thread-3  -消费者-  =商品=--->34321
Thread-0-生产者-=商品=--->34322
Thread-3  -消费者-  =商品=--->34322
Thread-1-生产者-=商品=--->34323
Thread-3  -消费者-  =商品=--->34323
Thread-0-生产者-=商品=--->34324
Thread-3  -消费者-  =商品=--->34324
......
Thread-1-生产者-=商品=--->29802
Thread-2  -消费者-  =商品=--->29802
Thread-0-生产者-=商品=--->29803
Thread-3  -消费者-  =商品=--->29803
Thread-1-生产者-=商品=--->29804
Thread-2  -消费者-  =商品=--->29804
Thread-0-生产者-=商品=--->29805
Thread-3  -消费者-  =商品=--->29805
Thread-1-生产者-=商品=--->29806
Thread-2  -消费者-  =商品=--->29806

....
....
....









阅读(1623) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~