Java-通过线程实现生产者消费者设计模式(平衡)

项目目录

在这里插入图片描述

定义一个消费者,通过构造器的方式注入仓库对象,用于线程调用仓库对象的消费方法,用于消费仓库中的产品.

Customer.java
package com.beikai.springboottestdemo.Thread.ProductorAndCustomer;

/**
 * @ClassName Customer
 * @Description TODO
 * @Author Admin
 * @Date 2019/4/7 21:50
 * @Version 1.0
 *
 * 消费者
 **/
public class Customer extends Thread{

    /**
     * 注入仓库
     */
    private MyStorage myStorage;

    /**
     * 构造器注入的方式
     */
    public Customer(MyStorage myStorage){
        super();
        this.myStorage = myStorage;
    }

    /**
     * 重写run方法
     */
    @Override
    public void run() {
        // 获取仓库中的产品
        for (int i = 0; i < 30; i++) {
            myStorage.getProductFromStro();
        }
    }
}

定义一个生产者,通过构造器的方式注入仓库对象,用于线程调用仓库中的添加产品到仓库的方法,用于添加仓库中的产品.

Productor.java
package com.beikai.springboottestdemo.Thread.ProductorAndCustomer;

import java.util.Random;

/**
 * @ClassName Productor
 * @Description TODO
 * @Author Admin
 * @Date 2019/4/7 21:46
 * @Version 1.0
 *
 *  生产者
 **/
public class Productor extends Thread{

    /**
     * 注入仓库
     */
    private MyStorage myStorage;

    /**
     * 构造器注入的方式
     */
    public Productor(MyStorage myStorage){
        super();
        this.myStorage = myStorage;
    }

    /**
     * 重写run方法
     */
    @Override
    public void run() {
        // 存入仓库商品
        for (int i = 0; i < 30; i++) {
            String product = "产品编号 : " + new Random().nextInt(100);
            myStorage.addProductToStor(product);
        }
    }
}

创建一个仓库对象,添加仓库容器,用于存放生产者提供的商品,定义容器的大小,创建一个添加商品到仓库的方法,创建一个从仓库中消费商品的方法.方法内通过轮询的方式来保证仓库中的商品维持一个平衡.当有生产者或消费者操作后,通知消费者或生产者,仓库中的商品有变化,可以继续之前的行为了.

MyStorage.java
package com.beikai.springboottestdemo.Thread.ProductorAndCustomer;

import java.util.LinkedList;

/**
 * @ClassName MyStorage
 * @Description TODO
 * @Author Admin
 * @Date 2019/4/7 18:40
 * @Version 1.0
 *
 *  生产者 消费者 之 仓库
 **/
public class MyStorage {

    /**
     * 定义一个容器,用于存放产品
     */
    private LinkedList<Object> linkedList = new LinkedList<>();

    /**
     * 定义容器的最大容量
     */
    public static final int STORAGE_COUNT = 10;

    /**
     * 生产者存进仓库的方法
     *  为了保证线程安全,设置为同步方法
     */
    public synchronized void addProductToStor(String product){

        // 为了保证仓库的容量在达到最大值的时候等待仓库中的数量减少再添加,此时,设置线程等待
        while (linkedList.size() >= STORAGE_COUNT){
            try {
                this.wait();
                System.out.println("仓库已经满了,请稍等再添加进仓库");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        System.out.println(Thread.currentThread().getName() + " 添加一个商品到仓库 : " + product);
        // 采用先进先出的原则, 所以新添加的商品放在后面  offer() 方法把对象存进后面
        linkedList.offer(product);

        // 添加商品到仓库后,通知消费者可以消费了
        this.notifyAll();
    }

    /**
     * 消费者从仓库中获取的方法
     *  为了保证线程安全,设置为同步方法
     */
    public synchronized void getProductFromStro(){

        // 防止当仓库中没有商品的情况出现,如果没有上面,消费者线程等待
        while (linkedList.size() <= 0){
            try {
                this.wait();
                System.out.println("仓库中已经没有商品了...");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        // 采用先进先出的原则,所以消费的时候先消费先添加进来的  从最上面获取
        Object poll = linkedList.poll();
        System.out.println(Thread.currentThread().getName()+" 消费者消费了一个商品 : " +poll);

        // 消费完成后,通知生产者可以添加商品了
        this.notifyAll();

    }
}

创建一个测试方法

StorageTest.java
package com.beikai.springboottestdemo.Thread.ProductorAndCustomer;

/**
 * @ClassName StorageTest
 * @Description TODO
 * @Author Admin
 * @Date 2019/4/7 19:00
 * @Version 1.0
 **/
public class StorageTest {
    public static void main(String[] args) {
        // 创建一个仓库
        MyStorage myStorage = new MyStorage();

        //创建三个生产者
        Productor zhangsan = new Productor(myStorage);
        Productor lisi = new Productor(myStorage);
        Productor chenqi = new Productor(myStorage);

        zhangsan.setName("zhangsan");
        lisi.setName("lisi");
        chenqi.setName("chenqi");

        zhangsan.start();
        lisi.start();
        chenqi.start();

        // 创建三个消费者
        Customer xiaoming = new Customer(myStorage);
        Customer xiaozhang = new Customer(myStorage);
        Customer xiaohua = new Customer(myStorage);

        xiaohua.setName("xiaohua");
        xiaozhang.setName("xiaozhang");
        xiaoming.setName("xiaoming");

        xiaohua.start();
        xiaozhang.start();
        xiaoming.start();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值