您的位置:首页 > 编程语言 > Java开发

java 编码实现简单的生产者-消费者模式

2017-03-20 17:26 736 查看
相信编程的人都听过生产者消费者模式,今天我们就简单来实现一下,了解一下原理:

这里我们定义的类有:

产品类,该类有产品的一些基本属性,此外还有生产和消费两个功能用以动态改变库存。

生产者类:该类具体生产产品。

消费者类:该类消费产品。

测试类:测试以上代码。

下面看代码,首先是产品类:

package review_java;

public class Product {

private Integer productNum = 0;
public Integer PRODUCT_MAX_NUM = 9;

public Integer getProductNum() {
return productNum;
}
public void setProductNum(Integer productNum) {
this.productNum = productNum;
}
public synchronized void produce(){
if(this.productNum >= this.PRODUCT_MAX_NUM){
System.out.println("产品已满,请过后在生产!");
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//return;
}
this.productNum ++;
System.out.println("生产者生产第" + this.productNum + "个产品.");
notifyAll();
}
public synchronized void consume(){
if(this.productNum <= 0){
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("产品已售罄,请等待生产!");
//return;
}
System.out.println("消费者取走了第" + this.productNum + "个产品.");
this.productNum --;
notifyAll();   //通知等待去的生产者可以生产产品了
}
}
接下来是生产者和消费者:

package review_java;

public class Produce implements Runnable {

private Product product;
public Produce(Product p){
this.product = p;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(this.product.getProductNum() <= this.product.PRODUCT_MAX_NUM){
this.product.produce();
try {
Thread.sleep(1000);//每隔一秒生产一个产品
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}


package review_java;

public class Consume implements Runnable {
private Product product;
public Consume(Product p){
this.product = p;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(this.product.getProductNum() >= 0){
this.product.consume();
try {
Thread.sleep(5000);//每隔5秒消费一个产品
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}
下面测试一下:

package review_java;

public class test {
public static void  main(String[] args) {
Product product = new Product();
Produce produce = new Produce(product);
Consume consume = new Consume(product);
Thread produce_thread = new Thread(produce);
Thread consume_thread = new Thread(consume);
produce_thread.start();
consume_thread.start();
}
}


运行结果:

生产者生产第1个产品.
消费者取走了第1个产品.
生产者生产第1个产品.
生产者生产第2个产品.
生产者生产第3个产品.
生产者生产第4个产品.
生产者生产第5个产品.
消费者取走了第5个产品.
生产者生产第5个产品.
生产者生产第6个产品.
生产者生产第7个产品.
生产者生产第8个产品.
生产者生产第9个产品.
消费者取走了第9个产品.
生产者生产第9个产品.
产品已满,请过后在生产!
消费者取走了第9个产品.
生产者生产第9个产品.
产品已满,请过后在生产!
消费者取走了第9个产品.
生产者生产第9个产品.
产品已满,请过后在生产!
消费者取走了第9个产品.
生产者生产第9个产品.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: