首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

黑马软件工程师_<<生产者和消费着>>

2013-09-18 
黑马程序员_生产者和消费着--------------------ASP.NetAndroidIOS开发、.Net培训、期待与您交流! -----

黑马程序员_<<生产者和消费着>>

--------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! --------------------


1. 生产者和消费者       1. 概述

          可以有多个消费者,也可以有多个生产者,他们可以一边生产一边消费。

 

         注意:

           不管是消费者还是生产者,在生产和消费的前提下,都要判断一下。要用while()循环判断,,如果用if()的话,有可能会发生连续生产或者连续消费,这样就不是一对一了,唤醒的话,就继续执行下面的语句,不再判断的原因。

如果用while()进行判断的话,就可以循环判断,防止前面的情况发生,但是要用signalAll()或notifyAll(),这样可以避免死锁。要是用signal()或notify()的话,会产生死锁。

      2.(Lock)

         1.5新特性:

         Lock和Condition对象。

         Lock替换了synchronized,以前锁是看不见的,替换成Lock可以看见的。可以使用Lock(接口)子类对象进行管理锁,lock()方法获取锁,unlock()方法释放锁。

         Condition替换了Object类中的wait(),notify(),notifyAll()方法。

         Condition对象通过锁来获取,newCondition()方法获取。

          Conditioncondition=lock.newCondition()

        condition.await()替换了wait()

        condition.signal()替换了notify()

          condition.signalAll()替换了notifyAll()

  

   

              3.示例1

          这是使用的是一个锁,一个Condition对象


import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/*资源*/public class Resource {    privateString name;    privateint count = 1;    privateboolean flag = false;    privateLock lock = new ReentrantLock();//锁    privateCondition condition_pro = lock.newCondition();//获取生产者的Condition对象    privateCondition condition_cus = lock.newCondition();//获取消费者Condition对象     /* 生产 */    publicvoid set(String name) throws InterruptedException {         lock.lock();         try{               while(flag)                    condition_pro.await();//线程等待(生产者不符合条件)               this.name = name + ":" +(count++);               System.out.println(Thread.currentThread().getName()+ "生产者生产:"                          + this.name);               this.flag= true;               condition_cus.signal();//唤醒消费者         }finally {               lock.unlock();         }    }     public voidshow() throws InterruptedException {         lock.lock();         try {               while(!flag)                    condition_cus.await();//线程等待 消费者,不符合条件               System.out.println(Thread.currentThread().getName()+ "取出第"                          +this.name );               this.flag= false;               condition_pro.signalAll();//唤醒生产者         }finally {               lock.unlock();         }    }}

 

结果:

---生产者A----生产者生产:商品:1

++消费者1++取出第商品:1

---生产者B----生产者生产:商品:2

++消费者2++取出第商品:2

---生产者A----生产者生产:商品:3

++消费者3++取出第商品:3

---生产者B----生产者生产:商品:4

++消费者2++取出第商品:4

---生产者A----生产者生产:商品:5

++消费者1++取出第商品:5

---生产者B----生产者生产:商品:6

++消费者3++取出第商品:6

---生产者A----生产者生产:商品:7

++消费者1++取出第商品:7

---生产者B----生产者生产:商品:8

++消费者2++取出第商品:8

---生产者A----生产者生产:商品:9

++消费者1++取出第商品:9

---生产者B----生产者生产:商品:10

++消费者3++取出第商品:10

---生产者A----生产者生产:商品:11

++消费者2++取出第商品:11

---生产者B----生产者生产:商品:12

++消费者3++取出第商品:12

---生产者A----生产者生产:商品:13

++消费者3++取出第商品:13

---生产者B----生产者生产:商品:14

++消费者1++取出第商品:14

---生产者B----生产者生产:商品:15

++消费者3++取出第商品:15

---生产者A----生产者生产:商品:16

++消费者2++取出第商品:16

 


--------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! --------------------


热点排行