生产者-消费者 线程同步 正态分布模拟

上班,日复一日,每次路过地铁站,扫码弄个自行车,就发现根据路过时间不同,能遇到有车可扫的概率也大不相同,于是想到使用线程同步 生产者-消费者模型来模拟一下(然实际不精确,未经过大量数据统计支持)

设定

  • 早高峰时间段8点~9点
  • 期间断断续续的有人骑车来到地铁站乘车去上班(生产者)
  • 期间断断续续有人路过地铁站或是从地铁站出来需要骑车去附近上班(消费者)
  • 随着时间变动而骑车过来和骑车离开的数量均呈现标准正态分布(偏移不同)

可见存在三个阶段,生产者市场(产出大于消费),消费者市场(消费大于产出),消费者市场又分为两个阶段(能够满足消费,不能够满足消费)
这里写图片描述


代码模拟
线程1:
实现定时添加资源(有人骑车来到地铁站)
线程2:
实现定时消耗资源(从地铁站骑车离开)若无资源则表示消耗失败,跳过(毕竟没车还能等不成,就只能走过去上班了)

标准正态分布

    public double gau(double x){
        int cegma = 1;
        int ue = 0;
        double y = 0;
        y = (1.0 / (Math.sqrt(2*Math.PI) * cegma) ) * Math.exp( - Math.pow((x-ue), 2) / (2 * Math.pow(cegma,2)) );
        return y;
    } 

测试代码git地址
用到了我的其他工具类提供的线程池工具(可直接使用new Thread修改),日志工具(out可改为System.out.println并拼接字符串)
此处采用60分段,每分钟一次

package util.test;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

import util.ThreadUtil;
import util.Tools;

/**
 * 地铁站用车 消费者 生产者模型
 */

public class TestCreatorCoster {
    int num = 0; // 资源数量
    Lock lock = new ReentrantLock();    //3.lock
    int dd = 1;             //每片间隔
    int maxdd = 60 / dd;    //最大分片
    int sleep = 1200 / 5 *  dd; //线程延时
    int ff = 10;    //缩进
    public TestCreatorCoster() {
        startCreator();
        startCoster();
    }
    //计算整形模拟分布
    public int gau(int x){
        double xd = ((1d * x - maxdd / 2) / maxdd * 4 );
        return (int) (100*gau(xd));
    }
    //标准正态分布
    public double gau(double x){
        int cegma = 1;
        int ue = 0;
        double y = 0;
        y = (1.0 / (Math.sqrt(2*Math.PI) * cegma) ) * Math.exp( - Math.pow((x-ue), 2) / (2 * Math.pow(cegma,2)) );
//      Tools.out(x,y);
        return y;
    } 
    // 开启生产者
    public void startCreator() {
        ThreadUtil.execute(ThreadUtil.DefaultThread, new Runnable() {
            public void run() {
                int tt = 0;
                while (true) {
                    tt++;
                    int make = gau(tt + maxdd / 5);
                    Tools.out("08:" + tt * dd, "生产" + make, Tools.fillStringBy("", "+", make/ff, 0));
                    lock.lock();
                    try{
                        num += make;
                    }finally{
                        lock.unlock();
                    }                           
                    Tools.out(Tools.fillStringBy("", "=", num/ff, 0));
                    ThreadUtil.sleep(sleep);
                    if (tt > maxdd)
                        break;
                }
            }
        });
    }

    // 开启消费者
    public void startCoster() {
        ThreadUtil.execute(ThreadUtil.DefaultThread, new Runnable() {
            public void run() {
                int tt = 0;
                while (true) {
                    tt++;
                    int cost = gau(tt - maxdd / 5);
                    lock.lock();
                    try{
                        if(num >= cost){
                            num -= cost;
                            Tools.out("08:" + tt * dd, "消费" + cost, Tools.fillStringBy("", "-", cost/ff, 0));
                        }else{
                            Tools.out("08:" + tt * dd, "失败" + cost, Tools.fillStringBy("", "-", cost/ff, 0));
                        }
                    }finally{
                        lock.unlock();
                    }                   
                    Tools.out(Tools.fillStringBy("", "=", num/ff, 0));
                    ThreadUtil.sleep(sleep);
                    if (tt > maxdd)
                        break;
                }
            }
        });
    }

    public static void main(String[] argv) {
        new TestCreatorCoster();

    }

}

测试结果输出

11:28:40.[ 08:1, 消费0,  ]
11:28:40.[ 08:1, 生产20, ++ ]
11:28:40.
11:28:40.==
11:28:40.[ 08:2, 消费1,  ]
11:28:40.[ 08:2, 生产22, ++ ]
11:28:40.=
11:28:40.====
11:28:41.[ 08:3, 消费1,  ]
11:28:41.[ 08:3, 生产24, ++ ]
11:28:41.====
11:28:41.======
11:28:41.[ 08:4, 生产25, ++ ]
11:28:41.[ 08:4, 消费1,  ]
11:28:41.======
11:28:41.========
11:28:41.[ 08:5, 消费1,  ]
11:28:41.[ 08:5, 生产27, ++ ]
11:28:41.========
11:28:41.===========
11:28:41.[ 08:6, 消费2,  ]
11:28:41.[ 08:6, 生产28, ++ ]
11:28:41.===========
11:28:41.==============
11:28:42.[ 08:7, 消费2,  ]
11:28:42.[ 08:7, 生产30, +++ ]
11:28:42.=============
11:28:42.================
11:28:42.[ 08:8, 消费3,  ]
11:28:42.[ 08:8, 生产31, +++ ]
11:28:42.================
11:28:42.===================
11:28:42.[ 08:9, 生产33, +++ ]
11:28:42.[ 08:9, 消费3,  ]
11:28:42.===================
11:28:42.======================
11:28:42.[ 08:10, 消费4,  ]
11:28:42.[ 08:10, 生产34, +++ ]
11:28:42.======================
11:28:42.=========================
11:28:43.[ 08:11, 消费4,  ]
11:28:43.=========================
11:28:43.[ 08:11, 生产35, +++ ]
11:28:43.============================
11:28:43.[ 08:12, 消费5,  ]
11:28:43.[ 08:12, 生产36, +++ ]
11:28:43.===============================
11:28:43.===============================
11:28:43.[ 08:13, 消费6,  ]
11:28:43.[ 08:13, 生产37, +++ ]
11:28:43.===============================
11:28:43.==================================
11:28:43.[ 08:14, 消费6,  ]
11:28:43.[ 08:14, 生产38, +++ ]
11:28:43.==================================
11:28:43.======================================
11:28:44.[ 08:15, 生产39, +++ ]
11:28:44.[ 08:15, 消费7,  ]
11:28:44.=========================================
11:28:44.=====================================
11:28:44.[ 08:16, 生产39, +++ ]
11:28:44.[ 08:16, 消费8,  ]
11:28:44.============================================
11:28:44.========================================
11:28:44.[ 08:17, 消费9,  ]
11:28:44.[ 08:17, 生产39, +++ ]
11:28:44.===========================================
11:28:44.===============================================
11:28:44.[ 08:18, 生产39, +++ ]
11:28:44.[ 08:18, 消费11, - ]
11:28:44.==================================================
11:28:44.==============================================
11:28:45.[ 08:19, 生产39, +++ ]
11:28:45.[ 08:19, 消费12, - ]
11:28:45.====================================================
11:28:45.=================================================
11:28:45.[ 08:20, 生产39, +++ ]
11:28:45.[ 08:20, 消费13, - ]
11:28:45.=======================================================
11:28:45.===================================================
11:28:45.[ 08:21, 消费14, - ]
11:28:45.[ 08:21, 生产39, +++ ]
11:28:45.======================================================
11:28:45.==========================================================
11:28:45.[ 08:22, 生产38, +++ ]
11:28:45.[ 08:22, 消费16, - ]
11:28:45.============================================================
11:28:45.========================================================
11:28:46.[ 08:23, 生产37, +++ ]
11:28:46.[ 08:23, 消费17, - ]
11:28:46.==========================================================
11:28:46.==============================================================
11:28:46.[ 08:24, 消费19, - ]
11:28:46.[ 08:24, 生产36, +++ ]
11:28:46.============================================================
11:28:46.===============================================================
11:28:46.[ 08:25, 生产35, +++ ]
11:28:46.[ 08:25, 消费20, -- ]
11:28:46.=============================================================
11:28:46.=================================================================
11:28:46.[ 08:26, 消费22, -- ]
11:28:46.[ 08:26, 生产34, +++ ]
11:28:46.===============================================================
11:28:46.==================================================================
11:28:46.[ 08:27, 消费24, -- ]
11:28:46.[ 08:27, 生产33, +++ ]
11:28:46.================================================================
11:28:46.===================================================================
11:28:47.[ 08:28, 消费25, -- ]
11:28:47.[ 08:28, 生产31, +++ ]
11:28:47.=================================================================
11:28:47.====================================================================
11:28:47.[ 08:29, 消费27, -- ]
11:28:47.[ 08:29, 生产30, +++ ]
11:28:47.=================================================================
11:28:47.====================================================================
11:28:47.[ 08:30, 消费28, -- ]
11:28:47.[ 08:30, 生产28, ++ ]
11:28:47.=================================================================
11:28:47.====================================================================
11:28:47.[ 08:31, 生产27, ++ ]
11:28:47.[ 08:31, 消费30, --- ]
11:28:47.====================================================================
11:28:47.=================================================================
11:28:48.[ 08:32, 生产25, ++ ]
11:28:48.[ 08:32, 消费31, --- ]
11:28:48.===================================================================
11:28:48.=================================================================
11:28:48.[ 08:33, 生产24, ++ ]
11:28:48.[ 08:33, 消费33, --- ]
11:28:48.==================================================================
11:28:48.================================================================
11:28:48.[ 08:34, 生产22, ++ ]
11:28:48.[ 08:34, 消费34, --- ]
11:28:48.===============================================================
11:28:48.=================================================================
11:28:48.[ 08:35, 生产20, ++ ]
11:28:48.[ 08:35, 消费35, --- ]
11:28:48.===============================================================
11:28:48.=============================================================
11:28:49.[ 08:36, 消费36, --- ]
11:28:49.[ 08:36, 生产19, + ]
11:28:49.============================================================
11:28:49.==============================================================
11:28:49.[ 08:37, 生产17, + ]
11:28:49.[ 08:37, 消费37, --- ]
11:28:49.============================================================
11:28:49.==========================================================
11:28:49.[ 08:38, 生产16, + ]
11:28:49.[ 08:38, 消费38, --- ]
11:28:49.==========================================================
11:28:49.========================================================
11:28:49.[ 08:39, 生产14, + ]
11:28:49.[ 08:39, 消费39, --- ]
11:28:49.=======================================================
11:28:49.======================================================
11:28:50.[ 08:40, 消费39, --- ]
11:28:50.[ 08:40, 生产13, + ]
11:28:50.===================================================
11:28:50.====================================================
11:28:50.[ 08:41, 生产12, + ]
11:28:50.[ 08:41, 消费39, --- ]
11:28:50.=================================================
11:28:50.==================================================
11:28:50.[ 08:42, 生产11, + ]
11:28:50.[ 08:42, 消费39, --- ]
11:28:50.===============================================
11:28:50.==============================================
11:28:50.[ 08:43, 消费39, --- ]
11:28:50.[ 08:43, 生产9,  ]
11:28:50.===========================================
11:28:50.============================================
11:28:51.[ 08:44, 生产8,  ]
11:28:51.[ 08:44, 消费39, --- ]
11:28:51.=========================================
11:28:51.========================================
11:28:51.[ 08:45, 生产7,  ]
11:28:51.[ 08:45, 消费39, --- ]
11:28:51.======================================
11:28:51.=====================================
11:28:51.[ 08:46, 生产6,  ]
11:28:51.[ 08:46, 消费38, --- ]
11:28:51.==================================
11:28:51.==================================
11:28:51.[ 08:47, 消费37, --- ]
11:28:51.[ 08:47, 生产6,  ]
11:28:51.===============================
11:28:51.===============================
11:28:52.[ 08:48, 消费36, --- ]
11:28:52.[ 08:48, 生产5,  ]
11:28:52.============================
11:28:52.============================
11:28:52.[ 08:49, 消费35, --- ]
11:28:52.[ 08:49, 生产4,  ]
11:28:52.=========================
11:28:52.=========================
11:28:52.[ 08:50, 生产4,  ]
11:28:52.[ 08:50, 消费34, --- ]
11:28:52.======================
11:28:52.======================
11:28:52.[ 08:51, 消费33, --- ]
11:28:52.[ 08:51, 生产3,  ]
11:28:52.===================
11:28:52.===================
11:28:52.[ 08:52, 生产3,  ]
11:28:52.[ 08:52, 消费31, --- ]
11:28:52.================
11:28:52.================
11:28:53.[ 08:53, 生产2,  ]
11:28:53.[ 08:53, 消费30, --- ]
11:28:53.=============
11:28:53.==============
11:28:53.[ 08:54, 消费28, -- ]
11:28:53.[ 08:54, 生产2,  ]
11:28:53.===========
11:28:53.===========
11:28:53.[ 08:55, 消费27, -- ]
11:28:53.[ 08:55, 生产1,  ]
11:28:53.========
11:28:53.========
11:28:53.[ 08:56, 消费25, -- ]
11:28:53.[ 08:56, 生产1,  ]
11:28:53.======
11:28:53.======
11:28:54.[ 08:57, 生产1,  ]
11:28:54.[ 08:57, 消费24, -- ]
11:28:54.====
11:28:54.====
11:28:54.[ 08:58, 消费22, -- ]
11:28:54.[ 08:58, 生产1,  ]
11:28:54.=
11:28:54.==
11:28:54.[ 08:59, 生产0,  ]
11:28:54.[ 08:59, 消费20, -- ]
11:28:54.
11:28:54.
11:28:54.[ 08:60, 生产0,  ]
11:28:54.[ 08:60, 失败19, - ]
11:28:54.
11:28:54.
11:28:55.[ 08:61, 失败17, - ]
11:28:55.[ 08:61, 生产0,  ]

所以
在这炎热的夏天,想要早上不走路,又想要睡懒觉,那是不可能的
只能提前一段时间出门,在八点三十就路过地铁站,才会有车可骑(话说都是因为车太少的啊),再往后就基本长时间无人骑车过来,所以是不会有车的

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

生产者-消费者 线程同步 正态分布模拟

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭