多线程实战,高速公路收费窗口模拟

Posted by zjh on September 7, 2020

题目

高速公路入口有5个收费口, 3个ETC口, 1个人工口(Manual), 1个ETC/人工混合口(Mix). ETC车辆在收费口的通过时间是10-20分钟(程序内模拟时间), 人工车辆在收费口的通过时间是15-25分钟(程序内模拟时间). 前面车辆未放行时, 后面车辆会依次在收费口外排队. 每一个新到收费站的车辆, 都会选择到时间最短的队伍后面进行排队.

要求写出模拟程序, 模拟60分钟(程序内模拟时间)内, 30辆ETC车和10辆人工车到达和通过收费口的场景, 模拟程序运行时长在15~40秒(真实时间)左右, 并达到如下效果:

0) 60分钟(程序内模拟时间)内, 40辆车, 到达时间完全随机, 且每1分钟至多只有1辆车到达. 比如整个程序模拟车辆到达时间范围是[0, 60], 对于任意一个程序模拟时间n, 0 <= n < 60, 在[n, n+1)这个区间范围内, 只能有一辆车到达.

1) 车辆通过收费口的时间在各个类型(ETC或人工)的时间范围内完全随机.

实现

import java.util.Collections;
import java.util.Random;
import java.util.Vector;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicInteger;


public class Exam implements Runnable{

    //初始化属性列表

    //车辆窗口办理数量集合,用于判断新到车辆选择的最短时间的办理通道
    private static CopyOnWriteArrayList<Integer> queue = new CopyOnWriteArrayList<>();
    //etc办理车辆的总数
    private static AtomicInteger etcCarCount = new AtomicInteger(30);
    //manual办理车辆的总数
    private static AtomicInteger manualCarCount = new AtomicInteger(10);
    //办理通过的车辆总数
    private static AtomicInteger passCarCount = new AtomicInteger(0);

    //线程内成员变量
    //到达车辆类型,用于判断窗口办理的时间
    private String carType;
    //收费窗口的下标,用于日志记录
    private AtomicInteger chargeWindow;

    //构造函数,初始化每个线程开启时,车辆类型和办理窗口
    public Exam(String carType, AtomicInteger chargeWindow){
        this.carType = carType;
        this.chargeWindow = chargeWindow;

        //自增通过车辆总数
        passCarCount.incrementAndGet();
    }

    @Override
    public void run() {
        //当前车辆序号,用于存储当前次线程办理的车辆序号
        int currNumber = passCarCount.get();
        //日志记录
        System.out.println(String.format("当前是第【%s】辆车,车辆类型为【%s】,当前到达【%s】收费窗口,当前收费窗口排队数量【%s】", currNumber, carType, chargeWindow.get()+1,queue.get(chargeWindow.get())));
        //定义随机对象
        Random random = new Random();
        //如果车辆类型为manual
        if("manual".equals(carType)){
            //人工车辆数量-1
                manualCarCount.decrementAndGet();
            //计算办理处理时间
            int time = random.nextInt(2500)%(1000+1)+1500;
            try {
                //模拟正在办理人工车辆通行
                Thread.sleep(time);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //窗口等待数量更新
            queue.set(chargeWindow.get(),queue.get(chargeWindow.get())-1);
            //日志记录办理时间
            System.out.println(String.format("- - - - 办理时间为【%s】- - - - ",time));
        }else{
            //如果车辆类型为etc
            //etc车辆数量-1
                etcCarCount.decrementAndGet();
                //计算办理处理时间
                int time = random.nextInt(2000)%(1000+1)+1000;
                try {
                    //模拟正在办理etc车辆通行
                    Thread.sleep(time);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //窗口等待数量更新
                queue.set(chargeWindow.get(),queue.get(chargeWindow.get())-1);
                //日志记录办理时间
                System.out.println(String.format("- - - - 办理时间为【%s】- - - - ",time));
        }
        //通过车辆的日志记录
        System.out.println(String.format(">>>>>第【%s】车辆通过,车辆类型为【%s】<<<<<",currNumber,carType));
    }

    public static void main(String[] args) {
        //赋值初始值 5个通道的实时车辆数
        for (int i = 0; i < 5; i++) {
            queue.add(0);
        }
        //定义随机变量
        Random random = new Random();

        for (int j = 0; j < 50; j++) {
            //找到当前排队数量最少的窗口,规定,index为0,1,2为ETC专用窗口口,index为3的为mix窗口,index为4为人工窗口
            //创建临时集合用于存放当前窗口的办理时间
            Vector<Integer> tempList = new Vector<>();
            for (int i = 0; i < queue.size(); i++) {
                if(i<3){
                    //etc办理时间
                    tempList.add(queue.get(i)*1000);
                }else{
                    //人工办理时间
                    tempList.add(queue.get(i)*1500);
                }
            }
            //定义时间最短的窗口下标
            int index=0;
            //找到临时集合里面的最小值
            int minTime =  Collections.min(tempList);
            //寻找时间最短的下标并赋值给index
            for (int i = 0; i <tempList.size() ; i++) {
                if(minTime==tempList.get(i)){
                    index=i;
                    break;
                }
            }
            //日志记录
            System.out.println(String.format("当前时间最短的窗口为【%s】号窗口",index+1));
            //增加指定下标窗口处理的数量
            queue.set(index,queue.get(index)+1);

            //随机选择1s来的车辆类型,规定随机值为 1,2,3 的为etc车辆,随机值为 4 的为人工车辆
            int nextCarIndex = random.nextInt(4)%(3+1)+1;
            //nextCarIndex =1/2/3 并且剩余ETC车辆的数量大于0
            if(nextCarIndex<=3&&etcCarCount.get()>0){
                //etc车辆数量不为0
                etcService(random,index);
            }else if(manualCarCount.get()>0&&nextCarIndex==4){
                //人工车辆数量不为0
              manualService(random,index);
            }else{
                if(etcCarCount.get()>0){
                    //etc车辆数量不为0
                    etcService(random,index);
                }else if(manualCarCount.get()>0){
                    //人工车辆数量不为0
                    manualService(random,index);
                }
                else{
                    //全部车辆通过完毕
                    System.out.println(String.format("当前执行次数【%s】,当前nextCarIndex【%s】,【ETC】数量【%s】,【人工】数量【%s】",j,nextCarIndex,etcCarCount,manualCarCount));
                    break;
                }
            }

            //一秒内最多来一辆车,随机模拟大于等于1s来一辆车
            try {
                Thread.sleep(new Random().nextInt(5000)%(4000+1)+1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
        //日志记录
        System.out.println(String.format("车辆已到达完毕,【ETC】剩余数量【%s】,【人工】剩余数量【%s】",etcCarCount.get(),manualCarCount.get()));



    }
    //etc车辆办理业务
    private static void etcService(Random random,Integer index){
        //日志记录
        System.out.println("******** 来了一辆【ETC】车辆 ********");
        //起线程跑
        Thread thread1 = new Thread(new Exam("etc",new AtomicInteger(index)));
        //线程开始
        thread1.start();


    }
    //人工车辆办理业务
    private static void manualService(Random random,Integer index){
        //日志记录
        System.out.println("******** 来了一辆【人工】车辆 ********");
        //起线程跑
        Thread thread1 = new Thread(new Exam("manual",new AtomicInteger(index)));
        //线程开始
        thread1.start();
    }
}



执行结果

这是主线程(车辆到来的空隙时间)>=1000ms的执行日志

当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【1】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1075】- - - - 
>>>>>第【1】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【2】辆车,车辆类型为【manual】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【2025】- - - - 
>>>>>第【2】车辆通过,车辆类型为【manual】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【3】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1894】- - - - 
>>>>>第【3】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【4】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1475】- - - - 
>>>>>第【4】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【5】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1854】- - - - 
>>>>>第【5】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【6】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1465】- - - - 
>>>>>第【6】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【7】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1372】- - - - 
>>>>>第【7】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【8】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1646】- - - - 
>>>>>第【8】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【9】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1681】- - - - 
>>>>>第【9】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【10】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
当前时间最短的窗口为【2】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【11】辆车,车辆类型为【etc】,当前到达【2】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1962】- - - - 
>>>>>第【10】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1821】- - - - 
>>>>>第【11】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【12】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1270】- - - - 
>>>>>第【12】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【13】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
当前时间最短的窗口为【2】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【14】辆车,车辆类型为【etc】,当前到达【2】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1742】- - - - 
>>>>>第【13】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1078】- - - - 
>>>>>第【14】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【15】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1515】- - - - 
>>>>>第【15】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【16】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1654】- - - - 
>>>>>第【16】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【17】辆车,车辆类型为【manual】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【2284】- - - - 
>>>>>第【17】车辆通过,车辆类型为【manual】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【18】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1627】- - - - 
>>>>>第【18】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【19】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
当前时间最短的窗口为【2】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【20】辆车,车辆类型为【etc】,当前到达【2】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1917】- - - - 
>>>>>第【19】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1508】- - - - 
>>>>>第【20】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【21】辆车,车辆类型为【manual】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1643】- - - - 
>>>>>第【21】车辆通过,车辆类型为【manual】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【22】辆车,车辆类型为【manual】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1853】- - - - 
>>>>>第【22】车辆通过,车辆类型为【manual】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【23】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
当前时间最短的窗口为【2】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【24】辆车,车辆类型为【etc】,当前到达【2】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1233】- - - - 
>>>>>第【23】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1052】- - - - 
>>>>>第【24】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【25】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1989】- - - - 
>>>>>第【25】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【26】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1904】- - - - 
>>>>>第【26】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【27】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1150】- - - - 
>>>>>第【27】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【28】辆车,车辆类型为【manual】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1958】- - - - 
>>>>>第【28】车辆通过,车辆类型为【manual】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【29】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1065】- - - - 
>>>>>第【29】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【30】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1289】- - - - 
>>>>>第【30】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【31】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1439】- - - - 
>>>>>第【31】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【32】辆车,车辆类型为【manual】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【2206】- - - - 
>>>>>第【32】车辆通过,车辆类型为【manual】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【33】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
当前时间最短的窗口为【2】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【34】辆车,车辆类型为【manual】,当前到达【2】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1874】- - - - 
>>>>>第【33】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【35】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【2311】- - - - 
>>>>>第【34】车辆通过,车辆类型为【manual】<<<<<
- - - - 办理时间为【1501】- - - - 
>>>>>第【35】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【36】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1975】- - - - 
>>>>>第【36】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【37】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1315】- - - - 
>>>>>第【37】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【38】辆车,车辆类型为【manual】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1988】- - - - 
>>>>>第【38】车辆通过,车辆类型为【manual】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【39】辆车,车辆类型为【manual】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
- - - - 办理时间为【1887】- - - - 
>>>>>第【39】车辆通过,车辆类型为【manual】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【40】辆车,车辆类型为【manual】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
当前时间最短的窗口为【2】号窗口
当前执行次数【40】,当前nextCarIndex【3】,【ETC】数量【0】,【人工】数量【0】
车辆已到达完毕,【ETC】剩余数量【0】,【人工】剩余数量【0】
- - - - 办理时间为【2025】- - - - 
>>>>>第【40】车辆通过,车辆类型为【manual】<<<<<


这是主线程(车辆到来的空隙时间)为100ms的执行日志

当前时间最短的窗口为【1】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【1】辆车,车辆类型为【manual】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
当前时间最短的窗口为【2】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【2】辆车,车辆类型为【etc】,当前到达【2】收费窗口,当前收费窗口排队数量【1】
当前时间最短的窗口为【3】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【3】辆车,车辆类型为【manual】,当前到达【3】收费窗口,当前收费窗口排队数量【1】
当前时间最短的窗口为【4】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【4】辆车,车辆类型为【etc】,当前到达【4】收费窗口,当前收费窗口排队数量【1】
当前时间最短的窗口为【5】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【5】辆车,车辆类型为【etc】,当前到达【5】收费窗口,当前收费窗口排队数量【1】
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【6】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【2】
当前时间最短的窗口为【2】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【7】辆车,车辆类型为【etc】,当前到达【2】收费窗口,当前收费窗口排队数量【2】
当前时间最短的窗口为【3】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【8】辆车,车辆类型为【etc】,当前到达【3】收费窗口,当前收费窗口排队数量【2】
当前时间最短的窗口为【4】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【9】辆车,车辆类型为【etc】,当前到达【4】收费窗口,当前收费窗口排队数量【2】
当前时间最短的窗口为【5】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【10】辆车,车辆类型为【etc】,当前到达【5】收费窗口,当前收费窗口排队数量【2】
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【11】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【3】
当前时间最短的窗口为【2】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【12】辆车,车辆类型为【etc】,当前到达【2】收费窗口,当前收费窗口排队数量【3】
当前时间最短的窗口为【3】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【13】辆车,车辆类型为【etc】,当前到达【3】收费窗口,当前收费窗口排队数量【3】
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【14】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【4】
- - - - 办理时间为【1292】- - - - 
>>>>>第【2】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【2】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【15】辆车,车辆类型为【etc】,当前到达【2】收费窗口,当前收费窗口排队数量【3】
当前时间最短的窗口为【2】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【16】辆车,车辆类型为【etc】,当前到达【2】收费窗口,当前收费窗口排队数量【4】
当前时间最短的窗口为【3】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【17】辆车,车辆类型为【etc】,当前到达【3】收费窗口,当前收费窗口排队数量【4】
- - - - 办理时间为【1187】- - - - 
>>>>>第【6】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【18】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【4】
- - - - 办理时间为【1431】- - - - 
>>>>>第【4】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1033】- - - - 
>>>>>第【8】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【4】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【19】辆车,车辆类型为【etc】,当前到达【4】收费窗口,当前收费窗口排队数量【2】
- - - - 办理时间为【1102】- - - - 
>>>>>第【9】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【4】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【20】辆车,车辆类型为【etc】,当前到达【4】收费窗口,当前收费窗口排队数量【2】
- - - - 办理时间为【1334】- - - - 
>>>>>第【7】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【2】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【21】辆车,车辆类型为【etc】,当前到达【2】收费窗口,当前收费窗口排队数量【4】
当前时间最短的窗口为【3】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【22】辆车,车辆类型为【etc】,当前到达【3】收费窗口,当前收费窗口排队数量【4】
- - - - 办理时间为【1723】- - - - 
>>>>>第【5】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1997】- - - - 
>>>>>第【3】车辆通过,车辆类型为【manual】<<<<<
当前时间最短的窗口为【5】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【23】辆车,车辆类型为【etc】,当前到达【5】收费窗口,当前收费窗口排队数量【2】
- - - - 办理时间为【1151】- - - - 
>>>>>第【12】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【2】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【24】辆车,车辆类型为【etc】,当前到达【2】收费窗口,当前收费窗口排队数量【4】
- - - - 办理时间为【2412】- - - - 
>>>>>第【1】车辆通过,车辆类型为【manual】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【25】辆车,车辆类型为【manual】,当前到达【1】收费窗口,当前收费窗口排队数量【4】
当前时间最短的窗口为【3】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【26】辆车,车辆类型为【etc】,当前到达【3】收费窗口,当前收费窗口排队数量【4】
当前时间最短的窗口为【4】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【27】辆车,车辆类型为【manual】,当前到达【4】收费窗口,当前收费窗口排队数量【3】
- - - - 办理时间为【1243】- - - - 
>>>>>第【15】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1171】- - - - 
>>>>>第【16】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1712】- - - - 
当前时间最短的窗口为【2】号窗口
******** 来了一辆【人工】车辆 ********
>>>>>第【11】车辆通过,车辆类型为【etc】<<<<<
当前是第【28】辆车,车辆类型为【manual】,当前到达【2】收费窗口,当前收费窗口排队数量【3】
- - - - 办理时间为【1825】- - - - 
>>>>>第【10】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【5】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【29】辆车,车辆类型为【manual】,当前到达【5】收费窗口,当前收费窗口排队数量【2】
- - - - 办理时间为【1616】- - - - 
>>>>>第【13】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【30】辆车,车辆类型为【manual】,当前到达【1】收费窗口,当前收费窗口排队数量【4】
当前时间最短的窗口为【2】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【31】辆车,车辆类型为【etc】,当前到达【2】收费窗口,当前收费窗口排队数量【4】
- - - - 办理时间为【1319】- - - - 
>>>>>第【18】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【32】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【4】
- - - - 办理时间为【1877】- - - - 
>>>>>第【14】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1101】- - - - 
>>>>>第【22】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【3】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【33】辆车,车辆类型为【etc】,当前到达【3】收费窗口,当前收费窗口排队数量【3】
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【34】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【4】
- - - - 办理时间为【1764】- - - - 
>>>>>第【17】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【3】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【35】辆车,车辆类型为【etc】,当前到达【3】收费窗口,当前收费窗口排队数量【3】
- - - - 办理时间为【1546】- - - - 
>>>>>第【20】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1295】- - - - 
>>>>>第【23】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【5】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【36】辆车,车辆类型为【etc】,当前到达【5】收费窗口,当前收费窗口排队数量【2】
- - - - 办理时间为【1256】- - - - 
>>>>>第【24】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1777】- - - - 
>>>>>第【19】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【4】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【37】辆车,车辆类型为【etc】,当前到达【4】收费窗口,当前收费窗口排队数量【2】
当前时间最短的窗口为【2】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【38】辆车,车辆类型为【manual】,当前到达【2】收费窗口,当前收费窗口排队数量【4】
- - - - 办理时间为【1806】- - - - 
>>>>>第【21】车辆通过,车辆类型为【etc】<<<<<
当前时间最短的窗口为【2】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【39】辆车,车辆类型为【manual】,当前到达【2】收费窗口,当前收费窗口排队数量【4】
当前时间最短的窗口为【3】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【40】辆车,车辆类型为【manual】,当前到达【3】收费窗口,当前收费窗口排队数量【4】
当前时间最短的窗口为【4】号窗口
当前执行次数【40】,当前nextCarIndex【2】,【ETC】数量【0】,【人工】数量【0】
车辆已到达完毕,【ETC】剩余数量【0】,【人工】剩余数量【0】
- - - - 办理时间为【1542】- - - - 
>>>>>第【27】车辆通过,车辆类型为【manual】<<<<<
- - - - 办理时间为【1688】- - - - 
>>>>>第【26】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1594】- - - - 
>>>>>第【28】车辆通过,车辆类型为【manual】<<<<<
- - - - 办理时间为【1737】- - - - 
>>>>>第【30】车辆通过,车辆类型为【manual】<<<<<
- - - - 办理时间为【1537】- - - - 
>>>>>第【32】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1353】- - - - 
>>>>>第【34】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1258】- - - - 
>>>>>第【36】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【2416】- - - - 
>>>>>第【25】车辆通过,车辆类型为【manual】<<<<<
- - - - 办理时间为【1813】- - - - 
>>>>>第【31】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1633】- - - - 
>>>>>第【33】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【2211】- - - - 
>>>>>第【29】车辆通过,车辆类型为【manual】<<<<<
- - - - 办理时间为【1945】- - - - 
>>>>>第【35】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1668】- - - - 
>>>>>第【39】车辆通过,车辆类型为【manual】<<<<<
- - - - 办理时间为【1965】- - - - 
>>>>>第【37】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1923】- - - - 
>>>>>第【38】车辆通过,车辆类型为【manual】<<<<<
- - - - 办理时间为【2194】- - - - 
>>>>>第【40】车辆通过,车辆类型为【manual】<<<<<

这是主线程(车辆到来的空隙时间)为1ms的执行日志

当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【1】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【1】
当前时间最短的窗口为【2】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【2】辆车,车辆类型为【manual】,当前到达【2】收费窗口,当前收费窗口排队数量【1】
当前时间最短的窗口为【3】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【3】辆车,车辆类型为【manual】,当前到达【3】收费窗口,当前收费窗口排队数量【1】
当前时间最短的窗口为【4】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【4】辆车,车辆类型为【etc】,当前到达【4】收费窗口,当前收费窗口排队数量【1】
当前时间最短的窗口为【5】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【5】辆车,车辆类型为【manual】,当前到达【5】收费窗口,当前收费窗口排队数量【1】
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【6】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【2】
当前时间最短的窗口为【2】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【7】辆车,车辆类型为【etc】,当前到达【2】收费窗口,当前收费窗口排队数量【2】
当前时间最短的窗口为【3】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【8】辆车,车辆类型为【etc】,当前到达【3】收费窗口,当前收费窗口排队数量【2】
当前时间最短的窗口为【4】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【9】辆车,车辆类型为【manual】,当前到达【4】收费窗口,当前收费窗口排队数量【2】
当前时间最短的窗口为【5】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【10】辆车,车辆类型为【etc】,当前到达【5】收费窗口,当前收费窗口排队数量【2】
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【11】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【3】
当前时间最短的窗口为【2】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【12】辆车,车辆类型为【etc】,当前到达【2】收费窗口,当前收费窗口排队数量【3】
当前时间最短的窗口为【3】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【13】辆车,车辆类型为【etc】,当前到达【3】收费窗口,当前收费窗口排队数量【3】
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【14】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【4】
当前时间最短的窗口为【2】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【15】辆车,车辆类型为【etc】,当前到达【2】收费窗口,当前收费窗口排队数量【4】
当前时间最短的窗口为【3】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【16】辆车,车辆类型为【etc】,当前到达【3】收费窗口,当前收费窗口排队数量【4】
当前时间最短的窗口为【4】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【17】辆车,车辆类型为【etc】,当前到达【4】收费窗口,当前收费窗口排队数量【3】
当前时间最短的窗口为【5】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【18】辆车,车辆类型为【etc】,当前到达【5】收费窗口,当前收费窗口排队数量【3】
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【19】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【5】
当前时间最短的窗口为【2】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【20】辆车,车辆类型为【etc】,当前到达【2】收费窗口,当前收费窗口排队数量【5】
当前时间最短的窗口为【3】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【21】辆车,车辆类型为【etc】,当前到达【3】收费窗口,当前收费窗口排队数量【5】
当前时间最短的窗口为【4】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【22】辆车,车辆类型为【etc】,当前到达【4】收费窗口,当前收费窗口排队数量【4】
当前时间最短的窗口为【5】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【23】辆车,车辆类型为【etc】,当前到达【5】收费窗口,当前收费窗口排队数量【4】
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【24】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【6】
当前时间最短的窗口为【2】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【25】辆车,车辆类型为【etc】,当前到达【2】收费窗口,当前收费窗口排队数量【6】
当前时间最短的窗口为【3】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【26】辆车,车辆类型为【etc】,当前到达【3】收费窗口,当前收费窗口排队数量【6】
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【27】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【7】
当前时间最短的窗口为【2】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【28】辆车,车辆类型为【etc】,当前到达【2】收费窗口,当前收费窗口排队数量【7】
当前时间最短的窗口为【3】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【29】辆车,车辆类型为【etc】,当前到达【3】收费窗口,当前收费窗口排队数量【7】
当前时间最短的窗口为【4】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【30】辆车,车辆类型为【manual】,当前到达【4】收费窗口,当前收费窗口排队数量【5】
当前时间最短的窗口为【5】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【31】辆车,车辆类型为【manual】,当前到达【5】收费窗口,当前收费窗口排队数量【5】
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【32】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【8】
当前时间最短的窗口为【2】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【33】辆车,车辆类型为【etc】,当前到达【2】收费窗口,当前收费窗口排队数量【8】
当前时间最短的窗口为【3】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【34】辆车,车辆类型为【etc】,当前到达【3】收费窗口,当前收费窗口排队数量【8】
当前时间最短的窗口为【4】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【35】辆车,车辆类型为【manual】,当前到达【4】收费窗口,当前收费窗口排队数量【6】
当前时间最短的窗口为【5】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【36】辆车,车辆类型为【etc】,当前到达【5】收费窗口,当前收费窗口排队数量【6】
当前时间最短的窗口为【1】号窗口
******** 来了一辆【ETC】车辆 ********
当前是第【37】辆车,车辆类型为【etc】,当前到达【1】收费窗口,当前收费窗口排队数量【9】
当前时间最短的窗口为【2】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【38】辆车,车辆类型为【manual】,当前到达【2】收费窗口,当前收费窗口排队数量【9】
当前时间最短的窗口为【3】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【39】辆车,车辆类型为【manual】,当前到达【3】收费窗口,当前收费窗口排队数量【9】
当前时间最短的窗口为【1】号窗口
******** 来了一辆【人工】车辆 ********
当前是第【40】辆车,车辆类型为【manual】,当前到达【1】收费窗口,当前收费窗口排队数量【10】
当前时间最短的窗口为【2】号窗口
当前执行次数【40】,当前nextCarIndex【3】,【ETC】数量【0】,【人工】数量【0】
车辆已到达完毕,【ETC】剩余数量【0】,【人工】剩余数量【0】
- - - - 办理时间为【1040】- - - - 
>>>>>第【1】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1007】- - - - 
>>>>>第【21】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1006】- - - - 
>>>>>第【32】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1045】- - - - 
>>>>>第【19】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1076】- - - - 
>>>>>第【27】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1208】- - - - 
>>>>>第【17】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1270】- - - - 
>>>>>第【23】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1271】- - - - 
>>>>>第【33】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1318】- - - - 
>>>>>第【13】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1437】- - - - 
>>>>>第【4】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1429】- - - - 
>>>>>第【10】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1431】- - - - 
>>>>>第【11】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1439】- - - - 
>>>>>第【7】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1461】- - - - 
>>>>>第【15】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1466】- - - - 
>>>>>第【20】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1448】- - - - 
>>>>>第【34】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1486】- - - - 
>>>>>第【18】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1476】- - - - 
>>>>>第【26】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1494】- - - - 
>>>>>第【25】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1603】- - - - 
>>>>>第【37】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1622】- - - - 
>>>>>第【31】车辆通过,车辆类型为【manual】<<<<<
- - - - 办理时间为【1745】- - - - 
>>>>>第【6】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1761】- - - - 
>>>>>第【24】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1787】- - - - 
>>>>>第【22】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1859】- - - - 
>>>>>第【8】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1854】- - - - 
>>>>>第【12】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1820】- - - - 
>>>>>第【36】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1854】- - - - 
>>>>>第【38】车辆通过,车辆类型为【manual】<<<<<
- - - - 办理时间为【1937】- - - - 
>>>>>第【5】车辆通过,车辆类型为【manual】<<<<<
- - - - 办理时间为【1936】- - - - 
>>>>>第【14】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1944】- - - - 
>>>>>第【28】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1969】- - - - 
>>>>>第【29】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1997】- - - - 
>>>>>第【16】车辆通过,车辆类型为【etc】<<<<<
- - - - 办理时间为【1979】- - - - 
>>>>>第【30】车辆通过,车辆类型为【manual】<<<<<
- - - - 办理时间为【2036】- - - - 
>>>>>第【35】车辆通过,车辆类型为【manual】<<<<<
- - - - 办理时间为【2135】- - - - 
>>>>>第【2】车辆通过,车辆类型为【manual】<<<<<
- - - - 办理时间为【2100】- - - - 
>>>>>第【40】车辆通过,车辆类型为【manual】<<<<<
- - - - 办理时间为【2247】- - - - 
>>>>>第【39】车辆通过,车辆类型为【manual】<<<<<
- - - - 办理时间为【2384】- - - - 
>>>>>第【3】车辆通过,车辆类型为【manual】<<<<<
- - - - 办理时间为【2480】- - - - 
>>>>>第【9】车辆通过,车辆类型为【manual】<<<<<