JAVASE_线程_生产者消费者简易设计模式

目录

1.设计过程

 2.代码演示

3.图形详解 


1.设计过程

生产者消费者模式是实现线程通信的案例之一;

       ① 创建一个count库存变量; 再创建一个lock锁对象,对象值随意;

        ②创建两个内部类线程,都继承Thread类

                一个是生产者子线程: 持续生产产品,库存量+1,到达一定库存量进入等待状态,释放锁,再进入消费者线程, 如此循环;

                一个是消费者子线程: 持续消费产品,库存量-1,当库存量为0时,唤醒生产者线程,自身进入等待状态同时释放锁, 如此循环;

注意: 因为两个子线程开始运行时是并行执行,可能会出现一种极端情况---> 开始库存量为零,而消费者线程先抢到锁的情况。所以需要在锁代码里面添加判断语句,使自己进入等待状态。

 2.代码演示

package com.bjsxt.test;
/*生产者消费者设计模式*/
public class Test9 {
    public int count; //库存数量计数器
    String lock = "锁";  //锁对象,名称随意

    //生产者线程
    public class Producer extends Thread{
        @Override
        public void run() {
            synchronized (lock) {
                while (true){
                    System.out.println("生产者生产了一个产品,当前库存量: " + (++count));
                    //每五百毫秒增加一个库存量,用于对结果可视化的优化
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //当产品数量为10时,唤醒其他调用wait()的锁,并且自己陷入WAITING等待状态并释放锁

                    if (count == 10) {
                        lock.notify();
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }


    //消费者线程
    public class Consumer extends Thread{
        @Override
        public void run() {
            synchronized (lock) {
                //避免出现库存量为0消费者依旧消费的极端情况
                if (count == 0) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                synchronized (lock) {
                    while (true){
                        System.out.println("消费者消费了一个产品,当前库存量: " + (--count));
                        try {
                            Thread.sleep(500);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        //库存量不能小于0,库存量被消耗到0时,消费者线程进入WAITING状态
                        if (count == 0) {
                            lock.notify();
                            try {
                                lock.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        }
    }

    public static void main(String[] args) {

        Test9 test9 = new Test9();
        //实例化生产者线程
        Producer producer = test9.new Producer();
        producer.start();//运行生产者线程

        //实例化消费者线程
        Consumer consumer = test9.new Consumer();
        consumer.start();//运行消费者线程


    }
}

        结果:

生产者生产了一个产品,当前库存量: 1
生产者生产了一个产品,当前库存量: 2
生产者生产了一个产品,当前库存量: 3
生产者生产了一个产品,当前库存量: 4
生产者生产了一个产品,当前库存量: 5
生产者生产了一个产品,当前库存量: 6
生产者生产了一个产品,当前库存量: 7
生产者生产了一个产品,当前库存量: 8
生产者生产了一个产品,当前库存量: 9
生产者生产了一个产品,当前库存量: 10
消费者消费了一个产品,当前库存量: 9
消费者消费了一个产品,当前库存量: 8
消费者消费了一个产品,当前库存量: 7
消费者消费了一个产品,当前库存量: 6
消费者消费了一个产品,当前库存量: 5
消费者消费了一个产品,当前库存量: 4
消费者消费了一个产品,当前库存量: 3
消费者消费了一个产品,当前库存量: 2
消费者消费了一个产品,当前库存量: 1
消费者消费了一个产品,当前库存量: 0
生产者生产了一个产品,当前库存量: 1

3.图形详解 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值