• 多线程:简易版本生产消费者模式纯语言概述


    一个消费者,一个生产者,一共就两个线程

    首先用最简单的语言描述一下这个模型
    对象为 资源对象,资源对象包括了生产方法,和消费方法,以及计数器
    生产者对象,只会生产
    消费者对象,只会销售
    生产者、消费者实现了Runnable接口,同时拥有一个资源字段和为资源字段构造函数
    主函数New了一个资源对象
    New了一个生产者,消费者分别放入一个Thread中执行,结果很可能生产者执行一半,消费者就来执行了,为了避免这种情况为共享数据部分加入Synchronized关键字,进行同步处理
    但是还有一个问题,生产者,消费者,何时运行的时机并没有确定,我们希望的是生产者生产一个,消费者消费一个。
    这个时候有了实现的思路
    添加一个判定Boolean标记盘子里是否有东西
    首先要判断盘子里是否有东西,如果有,生产者线程暂停,
    消费者进行消费,消费完毕后,唤醒生产者,修改标记为有东西。
    如果没有东西生产者进行生产的时候消费,生产完毕唤醒消费者。

    package hysy32.MultiThread;
    
    
    /**
     * Created by 小管 on 2017/4/4.
     */
    public class ShengChanXiaofeiLockDemo {
        public static void main(String[] args){
            mResource m = new mResource();
            shengchanzhe scz = new shengchanzhe(m);
            xiaofeizhe xfz = new xiaofeizhe(m);
            Thread t1 = new Thread(scz);
            Thread t2 = new Thread(xfz);
            t1.start();
            t2.start();
    
        }
    }
    
    class mResource {
    //    Lock l = new ReentrantLock();//声明一个对象锁定
        public boolean isEmpty=true;//标记盘子是否为空
    
        private int count=0;//计数器
    
    
        public synchronized void shengchan() throws InterruptedException {
    
    
    
                if (isEmpty) {/*如果没有对象则进入生产模式*/
    
                    count += 1;//生产+1
                    System.out.println("我生产了第:" + count + "件商品");//报告生产了产品
                    isEmpty=false;//改变盘子
                    notify();
                    //唤醒消费者
    
                } else {
                    wait();//进入等待状态
                }
    
    
        }
        public synchronized void xiaofei() throws InterruptedException {
    
    
    
                if (!isEmpty) {//如果盘子非空则进入消费
                    //报告消费状态
                    System.out.println("我消费了第:" + count + "件商品");
                    //改变盘子状态
                    isEmpty = true;
                    notify();//唤醒生产者
        } else {
                    wait();//如果盘子是空的则休眠
    
        }
    
    
        }
    
    }
    
    class shengchanzhe implements Runnable {
        private mResource r;
    
        public shengchanzhe(mResource r) {
            this.r = r;
        }
    
        @Override
        public void run() {
            while (true) {
                try {
                    r.shengchan();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    
    
        }
    }
    
    class xiaofeizhe implements Runnable {
        private mResource r;
    
        xiaofeizhe(mResource r) {
            this.r = r;
        }
    
        @Override
        public void run() {
            while (true) {
                try {
                    r.xiaofei();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

      

      

  • 相关阅读:
    P1273 有线电视网
    P2015 二叉苹果树
    POJ 3659 Cell Phone Network
    POJ 1463 Strategic game
    NC51178 没有上司的舞会
    NC15033 小G有一个大树
    13. SpringBoot 日志框架的默认配置 和 指定日志文件 以及 ProFile 功能
    12. SpringBoot 日志框架的关系 研究中间包的替换
    11. SpringBoot 日志框架 — 解决和思路
    41.el和template区别 & VUE实现分离写法
  • 原文地址:https://www.cnblogs.com/hysys32/p/6667030.html
Copyright © 2020-2023  润新知