Java基于Lock的生产者消费者模型示例
本文实例讲述了Java基于Lock的生产者消费者模型。分享给大家供大家参考,具体如下:
前面一篇《Java锁机制Lock用法》简单介绍了锁机制,这里进一步分析一下基于lock的生产者消费者模型。
packagecom.expgiga.JUC;
importjava.util.concurrent.locks.Condition;
importjava.util.concurrent.locks.Lock;
importjava.util.concurrent.locks.ReentrantLock;
/**
*生产者消费者案例
*/
publicclassTestProductorAndConsumerForLock{
publicstaticvoidmain(String[]args){
Clerkclerk=newClerk();
Productorproductor=newProductor(clerk);
Consumerconsumer=newConsumer(clerk);
newThread(productor,"生产者A").start();
newThread(consumer,"消费者B").start();
newThread(productor,"生产者C").start();
newThread(consumer,"消费者D").start();
}
}
//店员
classClerk{
privateintproduct=0;
privateLocklock=newReentrantLock();
privateConditioncondition=lock.newCondition();
//进货方法
publicvoidget(){
lock.lock();
try{
while(product>=1){//为了避免虚假唤醒,应该总是使用在循环中
System.out.println("产品已满!");
try{
condition.await();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+":"+++product);
condition.signalAll();
}finally{
lock.unlock();
}
}
//卖货方法
publicvoidsale(){
lock.lock();
try{
while(product<=0){
System.out.println("产品缺货!");
try{
condition.await();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+":"+--product);
condition.signalAll();
}finally{
lock.unlock();
}
}
}
//生产者
classProductorimplementsRunnable{
privateClerkclerk;
publicProductor(Clerkclerk){
this.clerk=clerk;
}
@Override
publicvoidrun(){
for(inti=0;i<20;i++){
try{
Thread.sleep(200);
}catch(InterruptedExceptione){
e.printStackTrace();
}
clerk.get();
}
}
}
//消费者
classConsumerimplementsRunnable{
privateClerkclerk;
publicConsumer(Clerkclerk){
this.clerk=clerk;
}
@Override
publicvoidrun(){
for(inti=0;i<20;i++){
clerk.sale();
}
}
}
运行结果:
产品缺货!
产品缺货!
生产者A:1
消费者B:0
产品缺货!
产品缺货!
生产者C:1
消费者B:0
产品缺货!
产品缺货!
生产者A:1
消费者B:0
产品缺货!
产品缺货!
生产者C:1
消费者B:0
产品缺货!
产品缺货!
生产者A:1
消费者B:0
产品缺货!
产品缺货!
生产者C:1
消费者B:0
产品缺货!
产品缺货!
生产者A:1
消费者B:0
产品缺货!
产品缺货!
生产者C:1
消费者B:0
产品缺货!
产品缺货!
生产者A:1
消费者B:0
产品缺货!
产品缺货!
生产者C:1
消费者B:0
产品缺货!
产品缺货!
生产者A:1
消费者B:0
产品缺货!
产品缺货!
生产者C:1
消费者B:0
产品缺货!
产品缺货!
生产者A:1
消费者B:0
产品缺货!
产品缺货!
生产者C:1
消费者B:0
产品缺货!
产品缺货!
生产者A:1
产品已满!
消费者B:0
产品缺货!
产品缺货!
生产者C:1
消费者B:0
产品缺货!
产品缺货!
生产者C:1
产品已满!
消费者B:0
产品缺货!
产品缺货!
生产者A:1
消费者B:0
产品缺货!
产品缺货!
生产者C:1
消费者B:0
产品缺货!
产品缺货!
生产者A:1
消费者B:0
产品缺货!
生产者C:1
消费者D:0
产品缺货!
生产者A:1
消费者D:0
产品缺货!
生产者C:1
消费者D:0
产品缺货!
生产者A:1
消费者D:0
产品缺货!
生产者C:1
消费者D:0
产品缺货!
生产者A:1
消费者D:0
产品缺货!
生产者C:1
消费者D:0
产品缺货!
生产者A:1
消费者D:0
产品缺货!
生产者C:1
消费者D:0
产品缺货!
生产者A:1
消费者D:0
产品缺货!
生产者C:1
消费者D:0
产品缺货!
生产者A:1
消费者D:0
产品缺货!
生产者C:1
消费者D:0
产品缺货!
生产者A:1
消费者D:0
产品缺货!
生产者C:1
消费者D:0
产品缺货!
生产者A:1
消费者D:0
产品缺货!
生产者C:1
消费者D:0
产品缺货!
生产者A:1
消费者D:0
产品缺货!
生产者C:1
消费者D:0
产品缺货!
生产者A:1
消费者D:0
更多java相关内容感兴趣的读者可查看本站专题:《Java进程与线程操作技巧总结》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。