Java多线程
前言
今天来学习经典的生产者消费者模型
提示:以下是本篇文章正文内容,下面案例可供参考
一、生产者消费者模型是干什么的?
生产者消费者模型是存在一批生产者,一批消费者,一个仓储,同时按以下条件进行生产消费
1.生产者只有在仓储没有满的时候进行生产,仓储满的时候进行等待
2.消费者只有在仓储存在货物的时候才进行消费,仓储空了则进行等待
3.消费者在仓储没有货物的时候应该通知生产者进行消费
4.生产者在生产完之后应该通知消费者消费
二、生产者
生产者只进行生产,代码如下(示例):
class Producer extends Thread{
//生产产品的数量
private int productNum;
//仓库
private Godown godown;
Producer(int productNum,Godown godown){
this.productNum = productNum;
this.godown = godown;
}
@Override
public void run(){
godown.doProduct(this.productNum);
}
}
三、消费者
消费者负责进行消费,代码如下(示例):
class ConSumer extends Thread{
//消费的数量
private int conSumNum;
//仓库
private Godown godown;
ConSumer(int conSumNum,Godown godown){
this.conSumNum = conSumNum;
this.godown = godown;
}
@Override
public void run(){
godown.doConSum(this.conSumNum);
}
}
四、仓库
仓库进行货物的存储,为确保货物的正确出入库,因此要对入库和出库进行同步操作避免数据出现不一致,同时在入库和出库的时候要通知到生产者和消费者进行生产和消费,代码如下所示
/**
* 仓库
*/
class Godown{
//最大库存
public static final int max_size = 100;
//当前库存
public int curNum;
Godown(){
}
Godown(int curNum){
this.curNum = curNum;
}
/**
* 生产指定数量的产品,修改成同步方法
*/
public synchronized void doProduct(int productNum){
while (this.curNum+productNum>max_size){
System.out.println("当前库存:"+ this.curNum +"+生产的数量:"+productNum+">最大库存100将等待");
try {
//线程等待
wait();
}catch (Exception e){
e.printStackTrace();
}
}
curNum += productNum;
System.out.println("已经生产了" + productNum + "个产品,现仓储量为" + curNum);
//唤醒在此对象等待的线程
notifyAll();
}
最终代码如下:
public static void main(String[] args){
Godown godown = new ProductConsomerDemo().new Godown(10);
Producer producer1 = new ProductConsomerDemo().new Producer(10,godown);
Producer producer2 = new ProductConsomerDemo().new Producer(20,godown);
Producer producer3 = new ProductConsomerDemo().new Producer(30,godown);
Producer producer4 = new ProductConsomerDemo().new Producer(40,godown);
ConSumer conSumer1 = new ProductConsomerDemo().new ConSumer(10,godown);
ConSumer conSumer2 = new ProductConsomerDemo().new ConSumer(10,godown);
ConSumer conSumer3 = new ProductConsomerDemo().new ConSumer(10,godown);
ConSumer conSumer4 = new ProductConsomerDemo().new ConSumer(10,godown);
producer1.start();
producer2.start();
producer3.start();
producer4.start();
conSumer1.start();
conSumer2.start();
conSumer3.start();
conSumer4.start();
}
总结
在生产者消费者模型当中,生产者消费者只负责自己单一的职责,仓储则是做为控制生产者消费者进程的等待和唤醒,当仓储满的时候,此时生产者线程将进行wait(),当一个消费者成功消费的时候将notifyAll()唤醒生产者线程进行生产。