编写一个生产者消费者模式的JAVA工程

编写一个生产者消费者模式的JAVA工程; 要求:
1)符合生产者消费者模式,避免出现资源访问冲突;
2)输出生产和消费的执行过程;
3)分别统计生产者和消费者的执行时长和等待时长(目前还不知道怎么搞,其他的参考http://blog.csdn.net/monkey_d_meng/article/details/6251879

  1. 创建类Storage,作为仓库
import java.util.LinkedList;

public class Storage {
    private final int MAX_SIZE=100;//仓库容量
    private LinkedList<Object> list = new LinkedList<Object>();//仓库存储的东西

    /*生产num件货物*/
    public void produce(int num){       
        synchronized(list){         //锁定list对象
            while(list.size()+num>MAX_SIZE){
                System.out.println("要生产的产品数量:"+num+"    现在的库存:"+list.size()+"    仓库不够放");
                try {
                    list.wait();//由于生产条件不满足,暂停生产
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("正在生产...");
            for (int i = 0; i < num; i++) {
                list.add(new Object());
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            System.out.println("已经生产的产品:"+num+"    现在的库存为:"+list.size());
            list.notifyAll();
        }
    }

    /*消费num件东西*/
    public void consume(int num){
        synchronized (list) {
            while (list.size() < num) {
                System.out.println("要消费的产品数量:"+num+"    现在的库存为:"+list.size()+"    仓库货不够消费");
                try {
                    list.wait();//由于库存不够,没法消费
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            System.out.println("正在消费...");
            for (int i = 0; i < num; i++) {
                list.remove();

                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            System.out.println("已经消费的产品:"+ num + "    现在的库存为:"+list.size());
            list.notifyAll();
        }
    }

    public LinkedList<Object> getList() {
        return list;
    }

    public void setList(LinkedList<Object> list) {
        this.list = list;
    }

    public int getMAX_SIZE() {
        return MAX_SIZE;
    }

}


  1. 创建类Producers,负责生产
public class Producers extends Thread{
    private int num;
    private Storage storage;

    public Producers(Storage storage) {
        this.storage = storage;
    }

    /*线程run函数*/
    public void run(){
        produce(num);

    }

    /*调用仓库类中的生产方法*/
    public void produce(int num) {
        storage.produce(num);
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public Storage getStorage() {
        return storage;
    }

    public void setStorage(Storage storage) {
        this.storage = storage;
    }


}
  1. 创建类Consumers,负责消费

public class Consumers extends Thread {
    private int num;
    private Storage storage;
    public Consumers(Storage storage) {
        this.storage = storage;
    }

    public void run(){
        consume(num);
    }
    /*调用仓库的消费函数*/
    public void consume(int num) {
        storage.consume(num);
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public Storage getStorage() {
        return storage;
    }

    public void setStorage(Storage storage) {
        this.storage = storage;
    }


}
  1. 测试类
/*测试类:用于显示生产者消费者的运行情况*/
public class Test {
    public static void main(String[] args) {
        Storage storage = new Storage();//构建一个公用的仓库

        //创建若干个生产者
        Producers producer1 = new Producers(storage);
        Producers producer2 = new Producers(storage);
        Producers producer3 = new Producers(storage);
        Producers producer4 = new Producers(storage);
        Producers producer5 = new Producers(storage);
        Producers producer6 = new Producers(storage);
        Producers producer7 = new Producers(storage);

        //创建若干个消费者
        Consumers consumer1 = new Consumers(storage);
        Consumers consumer2 = new Consumers(storage);
        Consumers consumer3 = new Consumers(storage);

        /*设置生产者生产数量*/
        producer1.setNum(10);
        producer2.setNum(10);
        producer3.setNum(10);
        producer4.setNum(10);
        producer5.setNum(10);
        producer6.setNum(10);
        producer7.setNum(80);

        /*设置消费者生产数量*/
        consumer1.setNum(50);
        consumer2.setNum(20);
        consumer3.setNum(30);

        /*启动线程*/
        consumer1.start();
        consumer2.start();
        consumer3.start();
        producer1.start();
        producer2.start();
        producer3.start();
        producer4.start();
        producer5.start();
        producer6.start();
        producer7.start();

    }
}

运行结果如下(每次结果都不同):

要消费的产品数量:50 现在的库存为:0 仓库货不够消费
要消费的产品数量:20 现在的库存为:0 仓库货不够消费
要消费的产品数量:30 现在的库存为:0 仓库货不够消费
正在生产…
已经生产的产品:10 现在的库存为:10
要消费的产品数量:30 现在的库存为:10 仓库货不够消费
要消费的产品数量:20 现在的库存为:10 仓库货不够消费
要消费的产品数量:50 现在的库存为:10 仓库货不够消费
正在生产…
已经生产的产品:80 现在的库存为:90
正在生产…
已经生产的产品:10 现在的库存为:100
要生产的产品数量:10 现在的库存:100 仓库不够放
要生产的产品数量:10 现在的库存:100 仓库不够放
要生产的产品数量:10 现在的库存:100 仓库不够放
要生产的产品数量:10 现在的库存:100 仓库不够放
正在消费…
已经消费的产品:50 现在的库存为:50
正在消费…
已经消费的产品:20 现在的库存为:30
正在消费…
已经消费的产品:30 现在的库存为:0
正在生产…
已经生产的产品:10 现在的库存为:10
正在生产…
已经生产的产品:10 现在的库存为:20
正在生产…
已经生产的产品:10 现在的库存为:30
正在生产…
已经生产的产品:10 现在的库存为:40

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的Java代码示例,演示了如何使用生产者消费者模式: ```java import java.util.LinkedList; public class ProducerConsumerExample { public static void main(String[] args) { LinkedList<Integer> buffer = new LinkedList<>(); int maxSize = 5; Thread producer = new Thread(new Producer(buffer, maxSize), "Producer"); Thread consumer = new Thread(new Consumer(buffer), "Consumer"); producer.start(); consumer.start(); } public static class Producer implements Runnable { private final LinkedList<Integer> buffer; private final int maxSize; public Producer(LinkedList<Integer> buffer, int maxSize) { this.buffer = buffer; this.maxSize = maxSize; } @Override public void run() { while (true) { synchronized (buffer) { while (buffer.size() == maxSize) { try { System.out.println("Buffer is full, waiting for consumer..."); buffer.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } int number = (int) (Math.random() * 100); System.out.println("Producing number: " + number); buffer.add(number); buffer.notifyAll(); } } } } public static class Consumer implements Runnable { private final LinkedList<Integer> buffer; public Consumer(LinkedList<Integer> buffer) { this.buffer = buffer; } @Override public void run() { while (true) { synchronized (buffer) { while (buffer.isEmpty()) { try { System.out.println("Buffer is empty, waiting for producer..."); buffer.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } int number = buffer.removeFirst(); System.out.println("Consuming number: " + number); buffer.notifyAll(); } } } } } ``` 在这个示例中,我们定义了一个 `Producer` 和一个 `Consumer` 类,它们都实现了 `Runnable` 接口,可在一个线程中运行。两个线程都使用了同一个共享的 `LinkedList` 对象,这是一个缓冲区,生产者往缓冲区中添加元素,消费者从缓冲区中移除元素。 在生产者消费者模式中,关键点是在生产者和消费者之间同步缓冲区。生产者会检查缓冲区是否已满,如果已满,则等待消费者消费一些元素。消费者会检查缓冲区是否为空,如果为空,则等待生产者生产一些元素。在生产者或消费者完成它们的工作后,会通知等待的线程继续运行。这个通知过程使用 `wait()` 和 `notifyAll()` 方法实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值