我是靠谱客的博主 热心棒球,最近开发中收集的这篇文章主要介绍生产者消费者模式模型解析,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

生产者消费者模式一直是行业内一个非常重要的模型,其中涉及多线程的知识。

一般我们将生产者与消费者都作为一个线程来看待,他们分别都有自己的方法,因此用java代码实现2个基本的线程。

class Consumer extends Thread{
private Resource re;
public Consumer(Resource re){
this.re=re;
}
public void run(){
while(true){
try{
Thread.sleep(10000);
}catch(InterruptedException e){
e.printStackTrace();
}
re.remove();
}
}
}
class Producer extends Thread{
private Resource re;
public Producer (Resource re){
this.re=re;
}
public void run(){
while(true){
try{
Thread.sleep(10000);
}catch(InterruptedException e){
e.printStackTrace();
}
re.add();
}
}
}

即生产者具有对资源对象进行生产的方法(add),而消费者对资源对象具有购买消费的方法(remove)

Resource 是一种资源对象产品类,具体代码如下

class Resource{
private int num =0;
private int size =10;
public synchronized void remove(){
if(num>0){
num--;
System.out.println("Consumer "+Thread.currentThread().getName()+" purchase one goods, "
+ "current leaves"+num);
notifyAll();
}else{
try{
wait();
System.out.print("Consumer "+Thread.currentThread().getName()+" in waiting");
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
public synchronized void add(){
if(num<size){
num++;
System.out.println(Thread.currentThread().getName()+"produce one goods, current pool have "+num);
notifyAll();
}else{
try{
wait();
System.out.println(Thread.currentThread().getName()+"for waiting");
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}

可以看到Resource类的方法中都用synchronized修饰了,即上了锁

随后再主函数中,创建多个生产者与消费者进行测试

public class CAPpattern {
public static void main(String[] args) {
// TODO Auto-generated method stub
Resource resource = new Resource();
Producer p1 =new Producer(resource);
Producer p2 =new Producer(resource);
Producer p3 =new Producer(resource);
Consumer c1 =new Consumer(resource);
Consumer c2 =new Consumer(resource);
p1.start();
p2.start();
p3.start();
c1.start();
c2.start();
}
}

 

最后

以上就是热心棒球为你收集整理的生产者消费者模式模型解析的全部内容,希望文章能够帮你解决生产者消费者模式模型解析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部