Java基于Lock的生产者消费者模型示例

网友投稿 291 2023-01-23


Java基于Lock的生产者消费者模型示例

本文实例讲述了java基于Lock的生产者消费者模型。分享给大家供大家参考,具体如下:

前面一篇《Java锁机制Lock用法》简单介绍了锁机制,这里进一步分析一下基于lock的生产者消费者模型。

package com.expgiga.JUC;

import java.util.concurrent.locks.Condition;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

/**

* 生产者消费者案例

*/

public class TestProductorAndConsumerForLock {

public static void main(String[] args) {

Clerk clerk = new Clerk();

Productor productor = new Productor(clerk);

Consumer consumer = new Consumer(clerk);

new Thread(productor, "生产者A").start();

new Thread(consumer, "消费者B").start();

new Thread(productor, "生产者C").start();

new Thread(consumer, "消费者D").start();

}

}

//店员

class Clerk {

private int product = 0;

private Lock lock = new ReentrantLock();

private Condition condition = lock.newCondition();

//进货方法

public void get() {

lock.lock();

try {

while (product >= 1) { //为了避免虚假唤醒,应该总是使用在循环中

System.out.println("产品已满!");

try {

condition.await();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

System.out.println(Thread.currentThread().getName() + " : " + ++product);

condition.signalAll();

} finally {

lock.unlock();

}

}

//卖货方法

public void sale() {

lock.lock();

try {

while (product <= 0) {

System.out.println("产品缺货!");

try {

condition.await();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

System.out.println(Thread.currentThread().getName() + " : " + --product);

condition.signalAll();

} finally {

lock.unlock();

}

}

}

//生产者

class Productor implements Runnable {

private Clerk clerk;

public Productor(Clerk clerk) {

this.clerk = clerk;

}

@Override

public void run() {

for (int i = 0; i < 20; i++) {

try {

Thread.sleep(200);

} catch (InterruptedException e) {

e.printStackTrace();

}

clerk.get();

}

}

}

//消费者

class Consumer implements Runnable {

private Clerk clerk;

public Consumer(Clerk clerk) {

this.clerk = clerk;

}

@Override

public void run() {

for (int i = 0; i < 20; i++) {

clerk.sale();

}

}

}

运行结果:

产品缺货!

产品缺货!

生产者A : 1

消费者B : 0

产品缺货!

产品缺货!

生产者C : 1

消费者B : 0

产品缺货!

产品缺货!

生产者A : 1

http://消费者B : 0

产品缺货!

产品缺货!

生产者C : 1

消费者B : 0

产品缺货!

产品缺货!

生产者A : 1

消费者B : 0

产品缺货!

产品缺货!

生产者C : 1

消费者B : 0

产品缺货!

产品缺货!

生产者A : 1

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:springboot hazelcast缓存中间件的实例代码
下一篇:Java实现的简单画图板示例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~