黑马程序员_<<生产者和消费着>>
--------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! --------------------
可以有多个消费者,也可以有多个生产者,他们可以一边生产一边消费。
注意:
不管是消费者还是生产者,在生产和消费的前提下,都要判断一下。要用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培训、期待与您交流! --------------------