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

来源:互联网 发布:mac游戏排行 编辑:程序博客网 时间:2024/06/09 21:52

相信编程的人都听过生产者消费者模式,今天我们就简单来实现一下,了解一下原理:

这里我们定义的类有:

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

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

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

测试类:测试以上代码。

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

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 blocke.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 blocke.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;}@Overridepublic void run() {// TODO Auto-generated method stubwhile(this.product.getProductNum() <= this.product.PRODUCT_MAX_NUM){this.product.produce();try {Thread.sleep(1000);//每隔一秒生产一个产品} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}

package review_java;public class Consume implements Runnable {private Product product;public Consume(Product p){this.product = p;}@Overridepublic void run() {// TODO Auto-generated method stubwhile(this.product.getProductNum() >= 0){this.product.consume();try {Thread.sleep(5000);//每隔5秒消费一个产品} catch (InterruptedException e) {// TODO Auto-generated catch blocke.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个产品.




0 0
原创粉丝点击