java多线程-生产者消费者模式

首先,谈到java多线程,不得不提的就是生产者和消费者模式,所谓生产者和消费者模式:生产者在生产商品的时候,消费者同时消费

一、设计思路

1、既然是同时运行,所以,肯定要用到多线程,用多个线程模拟生产者和消费者

2、他们操作的产品一定是相同的,呀,又涉及到了资源共享,所以,又要用到线程锁

3、但是单纯加上方法锁也可以,当产品不足时,或者产品过量时,不操作即可,但是会造成线程的空运行,资源的浪费,所以当生产者(或者消费者)存在这些问题时,就调用wait方法进入等待队列,另一方操作完成后,(notify)进行唤醒,完美!

二、代码实现(此处用到是wait和notifyAll方法,ReentrantLock方法类似,无非就是lock和unlock,大家可以尝试):

1、产品类:

/**
 * 产品类
 */
public class Product {
    public Product(String name) {
        this.name = name;
    }

    private String name;
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

2、产品池类:

/**
 * 产品池
 */
public class ProductPool {
    private List<Product> productList;
    private int maxNum;
    // 构造方法
    public ProductPool(int maxNum){
        // 用来存放所有的产品
        this.productList = new ArrayList<Product>();
        // 用来表示产品的最大数量
        this.maxNum = maxNum;
    }

    /**
     * 生产方法
     * @param product
     */
    public synchronized void push(Product product){
        // 判断是否已经达到最大长度,如果是,则进入等待队列
        if(this.productList.size() == maxNum){
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.productList.add(product);
        // 唤醒其他线程
        this.notifyAll();
    }

    /**
     * 消费方法
     * @return
     */
    public synchronized Product pop(){
        // 判断是否已经没有产品可以消费,如果没有,则将线程放入等待队列
        if(this.productList.size() == 0){
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        // 消费产品并且返回对应的产品
        Product product = this.productList.remove(0);
        this.notifyAll();
        return product;
    }

3、生产者

/**
 * 生产者
 */
public class Productor extends Thread{
    private ProductPool productPool;
    // 采用构造方法,将产品池引入
    public Productor(ProductPool productPool){
        this.productPool = productPool;
    }
    @Override
    public void run(){
        while (true){
            // 随机生成生产的产品
            String name = (int)(Math.random()*100)+"号产品";
            Product product = new Product(name);
            productPool.push(product);
            System.out.println("The product is producting product......named "+product.getName());
        }
    }

4、消费者

/**
 * 消费者
 */
public class Consumer extends  Thread{
    private ProductPool productPool;
    // 采用构造方法,将产品池引入
    public Consumer(ProductPool productPool){
        this.productPool = productPool;
    }
    @Override
    public void run() {
        while (true){
            // 消费产品,并且取出已经消费的产品
            Product product = this.productPool.pop();
            System.out.println("The consumer is consuming product......named "+product.getName());
        }
    }

5、测试类

/**
 * 生产者消费者测试类
 */
public class Test {
    public static void main(String[] args) {
        // new 产品池
        ProductPool productPool = new ProductPool(10);
        // new 生产者和消费者
        Productor productor = new Productor(productPool);
        Consumer consumer = new Consumer(productPool);
        // 开启线程
        productor.start();
        consumer.start();
    }

好啦,基于多线程的生产者和消费者的实现就是这些,欢迎业界大佬批评指正!

 

posted @ 2020-06-11 11:04  码在江湖  阅读(475)  评论(0编辑  收藏  举报