java线程中典型的生产者与消费者模式

模型描述:
java线程中典型的生产者与消费者模式,综合运用到thread中的notify()和wait();
仓库Godown的固定的容量大小max_size,同时有多个生产者向仓库生产放他产品,同时又有多个消费都从仓库取出产品,这就涉及到生产和消费过程中的同步问题,利用多线程技术可以很好的解决这个问题

1、生产者模型,定义为一个线程即实现Thread类
package com.leiht.thread.waitnotify;

public class Producer extends Thread {

private int needNum;
private Godown godown;

public Producer(int needNum, Godown godown) {
this.needNum = needNum;
this.godown = godown;
}


@Override
public void run() {
godown.produce(needNum);
}


public int getNeedNum() {
return needNum;
}

public void setNeedNum(int needNum) {
this.needNum = needNum;
}

public Godown getGodown() {
return godown;
}

public void setGodown(Godown godown) {
this.godown = godown;
}

}

2、消费模型
package com.leiht.thread.waitnotify;

public class Consumer extends Thread {

private int needNum;
private Godown godown;

public Consumer(int needNum, Godown godown) {
this.needNum = needNum;
this.godown = godown;
}

@Override
public void run() {
godown.consume(needNum);
}


public int getNeedNum() {
return needNum;
}

public void setNeedNum(int needNum) {
this.needNum = needNum;
}

public Godown getGodown() {
return godown;
}

public void setGodown(Godown godown) {
this.godown = godown;
}

}


仓库模型(核心代码)
package com.leiht.thread.waitnotify;

public class Godown {

public int current_size;
public static final int max_size = 100;

public static int getMaxSize() {
return max_size;
}

public Godown(int current_size) {
this.current_size = current_size;
}

/*
* 生产方法
*/
public synchronized void produce(int needNum) {
//可以生产
if((needNum + current_size) < max_size) {
System.out.println("开始生产");
current_size = current_size + needNum;
System.out.println("生产完成");
notifyAll();

}else { //不能生产 将当前线程挂到this(当前)对象上
try {
System.out.println("当前库存过大,挂起等待");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

/*
* 消费方法
*/
public synchronized void consume(int needNum) {

if(needNum > current_size) {
try {
System.out.println("当前商品不足,等等待");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("开始消费");
current_size = current_size - needNum;
System.out.println("结束消费");
notifyAll();

}

}


测试代码
package com.leiht.thread.waitnotify;

public class Test {
public static void main(String[] args) {
Godown godown = new Godown(30);
Consumer c1 = new Consumer(50, godown);
Consumer c2 = new Consumer(20, godown);
Consumer c3 = new Consumer(30, godown);
Producer p1 = new Producer(10, godown);
Producer p2 = new Producer(10, godown);
Producer p3 = new Producer(10, godown);
Producer p4 = new Producer(10, godown);
Producer p5 = new Producer(10, godown);
Producer p6 = new Producer(10, godown);
Producer p7 = new Producer(80, godown);
c1.start();
c2.start();
c3.start();
p1.start();
p2.start();
p3.start();
p4.start();
p5.start();
p6.start();
p7.start();
}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值