多线程编程四-生产消费模型

目录

1 定义生产者

2 定义消费者

3 定义admin接口

4 SynchronizedAdmin实现

5 ReentrantLockAdmin实现

6 测试程序


本次生产消费模型分别用synchronized和ReentrantLock实现
思路:分为4部分,主程序、生产销售管理,生产者线程,消费者线程。
生产销售管理中有商品数组,当前库存量,生产线方法,消费方法,分别在生产者和消费者run函数调用
主程序创建管理系统对象,初始化生产者,消费者,启动线程。

1 定义生产者

class Generator implements Runnable {
    private Admin admin;
    public Generator(Admin admin) {
        this.admin  =  admin;
    }
    public void run() {
        for(int i = 1; i<= 25; i ++) {
            String good = "商品" + i;
            admin.generate(good);
        }
    }
}

2 定义消费者

class Consumer implements Runnable {
    private Admin admin = null;
    public Consumer(Admin admin) {
        this.admin  =  admin;
    }
    public void run() {
        for(int i = 1; i<= 25; i ++) {
            admin.consume();
        }
    }
}

3 定义admin接口

interface Admin {
    String[] GOODS = new String[6];
    
    public void generate(String good);
    
    public void consume();
}

4 SynchronizedAdmin实现

class SynchronizedAdmin implements Admin{
    private int goodNum = 0;
    {
        System.out.println("测试SynchronizedAdmin");
    }
    //同步锁实现同步,同步监视器调用wait、notify方法实现通信
    public synchronized void generate(String good) {
        try {
            if(goodNum == GOODS.length) {
                //让出线程,释放资源
                this.wait();
            }
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        GOODS[goodNum] = good;
        goodNum ++;
        System.out.println("生产线正在生产第" + goodNum + "个商品,商品名是:" + GOODS[goodNum - 1]);
        //唤醒当前对象池中等待的一个线程。
        this.notify();
    }
    public synchronized void consume() {
        try {
            if(goodNum == 0) {
                // 让出线程,释放资源
                this.wait();
            }
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("正在消费第" + goodNum + "个商品,商品名是:" + GOODS[goodNum - 1]);
        goodNum--;
        //唤醒当前对象池中等待的一个线程。
        this.notify();
    }
}

5 ReentrantLockAdmin实现

class ReentrantLockAdmin implements Admin {
    private int goodNum = 0;
    private Lock lock = new ReentrantLock();
    private Condition condition = lock.newCondition();
    {
        System.out.println("测试ReentrantLockAdmin");
    }
    //重入锁实现同步,condition的await、signal实现通信
    public void generate(String good) {
        lock.lock();
        try {
            if(goodNum == GOODS.length) {
                // 让出线程,释放资源
                condition.await();
            }
            Thread.sleep(100);
            GOODS[goodNum] = good;
            goodNum ++;
            System.out.println("生产线正在生产第" + goodNum + "个商品,商品名是:" + GOODS[goodNum - 1]);
            //唤醒当前对象池中等待的一个线程。
            condition.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally{
            lock.unlock();
        }        
    }
    public void consume() {
        lock.lock();
        try {
            if(goodNum == 0) {
                //让出线程,释放资源
                condition.await();
            }
            Thread.sleep(100);
            System.out.println("正在消费第" + goodNum + "个商品,商品名是:" + GOODS[goodNum - 1]);
            goodNum --;
            //唤醒当前对象池中等待的一个线程。
            condition.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally{
            lock.unlock();
        }
    }
}

6 测试程序

public static void main(String[] args) {
    //测试同步锁管理系统
    //Admin admin = new SynchronizedAdmin();
    //测试重入锁管理系统
    Admin admin = new ReentrantLockAdmin();
    Generator generator = new Generator(admin);
    Thread thr1 = new Thread(generator);
    Consumer con = new Consumer(admin);
    Thread thr2 = new Thread(con);
    thr1.start();
    thr2.start();
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值