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程序设计有所帮助。