Введено:
Некоторое время назад я пошел в банк, чтобы справиться с бизнесом, и в очереди было так много людей. Потребовалось менее 5 минут, чтобы справиться с бизнесом, но я ждал два часа (я считаю, что многие люди столкнулись с этой ситуацией). Я потерял дар речи об этом уровне обслуживания, но проблема снова возникает. Банк должен открыть несколько окон, чтобы обеспечить общее качество обслуживания и коэффициент использования ресурсов? Далее мы будем моделировать эту проблему с помощью теории очередей.
Введение в теорию очереди
Теория очередей - это математическая теория и метод, который изучает явление случайного сбора и дисперсии систем и рабочей инженерии случайных систем. Он также известен как теория систем случайного обслуживания и является отраслью исследований операций. Давайте упростим теорию очередей ниже и сначала посмотрим на следующую цифру:
Мы организуем несколько синих сервисных столов с левой стороны картины, с красными клиентами, которые могут прийти справа, и желтая зона ожидания в середине. Если сервисная стойка простаивает, клиенты могут напрямую получать услуги, в противном случае они должны ждать в желтой области. Порядок обслуживания клиентов принимает принцип первого и текущего обслуживания. Теперь, если мы знаем распределение вероятностей приезжающих клиентов, то как мы можем организовать несколько работ обслуживания слева, чтобы достичь лучшего уровня обслуживания и обеспечить скорость использования службы службы? Затем мы создадим модель для моделирования этой проблемы.
Теория очереди реализована шаг за шагом
1) Для теории очередей нам сначала нужно определить атрибуты клиента, знать, когда клиент прибывает, требуется время обслуживания и т. Д. Сначала мы создаем класс клиента, где мы указываем максимальное и минимальное время для обслуживания клиентов. Здесь, чтобы упростить, мы напрямую думаем, что время обслуживания совершенно случайно:
открытый класс CustomerBean {// Минимальное время обслуживания частное статика int minservetime = 3 * 1000; // максимальное время обслуживания частное статический int maxservetime = 15 * 1000; // клиент достигает времени частного долгого времени; // Потребности клиента Время обслуживания частное int servetie -time; public CustomerBean () {// Установить время прибытия времени прибытия = System.currentTimeMillis (); // Случайное установление времени обслуживания клиентов Servetime = (int) (math.random () * (maxservetime - minservetime) + minservetime); }} 2) Мы определяем клиента выше, а затем нам нужно определить очередь очереди. Давайте сначала посмотрим на атрибуты очереди. Здесь мы определяем массив для сохранения клиентов в очереди, определили минимальные и максимальные интервалы времени для прибытия следующего клиента и вероятность того, что клиент придет (будет кратко объяснено здесь, если интервальное время следующего клиента составляет 3, но он рассчитывается по вероятности и удовлетворены, что клиент не введет в должность. Причина, по причине того, что он достигнет, в качестве значимости в качестве возможного, и в качестве возможного, и в качестве возможного, и в качестве возможного, и в качестве возможного, и в качестве возможного вопроса.
Public Class Customerquene {// ожидание очереди клиентов Private LinkedList <CustomerBean> Customs = new LinkedList <cestingBean> (); // самое короткое время для следующего клиента приехать в частный int mintime = 0; // максимальное время для следующего клиента приехать частному int maxtime = 1 * 1000; // вероятность появления клиентов частной двойной ставки = 0,9; // определить, является ли клиент частный логический флаг = true; // максимальное количество людей в очереди в частном int maxwaitnum = 0; } 3) Когда есть клиенты и очереди, мы настроием потоку для создания клиентов для постоянного генерирования клиентов. Вот распределения времени и вероятностей, которые мы упомянули выше.
/ ***@Описание: сгенерировать поток клиента*@версия: 1.1.0*/ private Class CustomerThread Extends {private CustomerThread (String name) {super (name); } @Override public void run () {while (flag) {// Добавить нового клиента в конце команды if (math.random () <) {customs.addlast (new Customerbean ()); if (maxwaitnum <customs.size ()) {maxwaitnum = customs.size (); }} int sleeptime = (int) (math.random () * (maxtime - mintime) + mintime); try {timeUnit.milliseconds.sleep (Sleeptime); } catch (Exception e) {e.printstackTrace (); }}}}} 4) Если в очереди в очереди есть клиенты, чтобы разрезать бесплатную службу обслуживания, вам нужно заставить клиента в главе команды получить услугу.
Public Synchrinized CustomerBean GetCustomerBean () {if (customs == null || customs.size () <1) {return null; } return customers.removefirst (); } 5) Связанные с клиентом атрибуты и методы готовы. Давайте установим атрибуты, связанные с службой. Здесь мы напрямую устанавливаем службу службы в потоку, чтобы определить некоторые индикаторы обслуживания, такие как количество обслуживаемых клиентов, общее время ожидания, общее время обслуживания, максимальное время ожидания и т. Д.
Общедоступный класс ServantThread Extends Thread {// Количество клиентов обслуживания private static int customernum = 0; // Общее время ожидания частное статическое int sumwaittime = 0; // Общее время обслуживания частное статический int sumservetime = 0; // максимальное время ожидания частное статический int maxwaittime = 0; Частный логический флаг = false; Приватное название строки; } 6) Основная задача Сервисной службы - обслуживать клиентов. Здесь мы пишем операции, связанные с обслуживанием клиентов в метод запуска потока.
public void run () {flag = true; while (flag) {customerbean customer = customerquene.getCustomerQuene (). getCustomerBean (); // Если поток клиента был закрыт, и в очереди нет клиентов, поток службы службы закрывается и выпускает if (customer == null) {if (! Customerquene.getCustomerQuene (). Isflag ()) {flag = false; print (); } продолжать; } long Now = System.currentTimeMillis (); int wailtime = (int) (теперь - customer.getarriveTime ()); // Сохранить максимальное время ожидания, если (waftime> maxwaittime) {maxwaittime = wailtime; } // Время сна - это время обслуживания клиента, которое представляет период обслуживания в течение этого периода времени обслуживания клиентов. Try {timeunit.milliseconds.sleep (customer.getServetime ()); } catch (Exception e) {e.printstackTrace (); } System.err.println (имя + «Время для обслуживания клиентов:« + customer.getServeservetime () + "MS/T клиент ожидание:" + wailTime + "ms"); Customernum ++; sumwaittime += waftime; sumservetime += customer.getServetime (); }} 7) Наконец, мы пишем тестовую модель для проверки уровня обслуживания
/ ** *@Описание: */ package com.lulei.opsearch.quene; импортировать java.util.concurrent.timeUnit; открытый тест класса {public static void main (string [] args) {// открыть дверной систему.out.println («Откройте дверь и возьмите клиентов!»); логический флаг = true; Customerquene.getCustomerQuene (); long a = system.currenttimemillis (); int serviceNum = 10; for (int i = 0; i <serviceNum; i ++) {ServantThread Thread = New ServantThread ("Служба"+I); Thread.Start (); } while (flag) {long b = System.currentTimeMiMillis (); if (b - a> 1 * 60 * 1000 && flag) {// close flag = false; Customerquene.getCustomerQuene (). Close (); System.out.println («Закройте дверь и не забирайте клиентов!»); } System.out.println ("Системная время выполнения:" + (b -a) + "ms"); System.out.println ("Системное время простоя:" + ((b -a) * Servantnum - ServantThread.getSumServetime ())); ServantThread.print (); try {timeUnit.seconds.sleep (2); } catch (Exception e) {e.printstackTrace (); }}}} Результаты бега
1) Начало работы
2) Клиент генерирует закрытие потока
3) Окончательный уровень обслуживания
Изменив количество работ сервисных работ, вы можете оценить, сколько столов обслуживания должно быть настроено в текущей ситуации с клиентом.
Полный код
1) Категория клиента
/ ** *@Описание: */ package com.lulei.opsearch.quene; открытый класс CustomerBean {// Минимальное время обслуживания частное статика int minservetime = 3 * 1000; // максимальное время обслуживания частное статический int maxservetime = 15 * 1000; // клиент достигает времени частного долгого времени; // Потребности клиента Время обслуживания частное int servetie -time; public CustomerBean () {// Установить время прибытия времени ravingtime = system.currenttimemillis (); // Случайно установить время обслуживания клиентов Servetime = (int) (math.random () * (maxservetime - minservetime) + minservetime); } public static int getMinservetime () {return minservetime; } public static void setMinservetime (int minservetime) {customerbean.minservetime = minservetime; } public static int getMaxServetime () {return maxServetime; } public static void setmaxServetime (int maxServetime) {customerbean.maxServetime = maxServetime; } public long getArriveTime () {return ravintime; } public void setArriveTime (Long Ravrivetime) {this.Arrivetime = ravivetime; } public int getServetime () {return servetyme; } public void setServetime (int Servetime) {this.Servetime = servetime; }}2) Очередь клиентов
/ ** *@Описание: */ package com.lulei.opsearch.quene; импортировать java.util.linkedlist; импортировать java.util.concurrent.timeUnit; Public Class Customerquene {// ожидание очереди клиентов Private LinkedList <CustomerBean> Customs = new LinkedList <cestingBean> (); // самое короткое время для следующего клиента приехать в частный int mintime = 0; // максимальное время для следующего клиента приехать частному int maxtime = 1 * 1000; // вероятность появления частной двойной ставки клиента = 0,9; // определить, продолжают ли клиенты генерировать частный логический флаг = true; // максимальное количество людей в очереди в частной int maxwaitnum = 0; public int getmaxwaitnum () {return maxwaitnum; } public boolean isflag () {return flag; } / ** * @return * @author: lulei * @description: Получить клиента в главу очереди * / public synchronized customerbean getCustomerBean () {if (customs = null || custom.size () <1) {return null; } return customers.removefirst (); } public void close () {if (flag) {flag = false; }} / ** * @return * @author: lulei * @description: получить количество клиентов ожидания * / public int getWaitCustomernum () {return cumbers.size (); } / ***@Описание: сгенерировать поток клиента*@версия: 1.1.0* / private Class CustomerThread Extends {private CustomerThread (String name) {super (name); } @Override public void run () {while (flag) {// Добавить нового клиента в конце команды if (math.random () <) {customs.addlast (new Customerbean ()); if (maxwaitnum <customs.size ()) {maxwaitnum = customs.size (); }} int sleeptime = (int) (math.random () * (maxtime - mintime) + mintime); try {timeUnit.milliseconds.sleep (Sleeptime); } catch (Exception e) {e.printstackTrace (); }}}}} // Синглтон режим запуск частного статического класса customerquendao {private static customerquene customerquene = new CustomerQuene (); } private CustomerQuene () {CustomerTread CustomerThread = New CustomerThread ("Поток генерации клиентов"); CustomerThread.Start (); } public static customerquene getCustomerQuene () {return customerquendao.customerquene; } // singleton mode end public int getMintime () {return mintime; } public void setMintime (int mintime) {this.mintime = mintime; } public int getMaxtime () {return maxtime; } public void setmaxtime (int maxtime) {this.maxtime = maxtime; } public Double getRate () {return Speat; } public void setRate (двойная скорость) {this.Rate = rate; }} 3) Поток службы службы стола
/ ** *@Описание: */ package com.lulei.opsearch.quene; импортировать java.util.concurrent.timeUnit; импорт com.lulei.util.parseutil; Общедоступный класс ServantThread Extends Thread {// Количество клиентов обслуживания private static int customernum = 0; // Общее время ожидания частное статическое int sumwaittime = 0; // Общее время обслуживания частное статический int sumservetime = 0; // максимальное время ожидания частное статический int maxwaittime = 0; Частный логический флаг = false; Приватное название строки; public ServantThread (String name) {super (name); this.name = name; } public static int getMaxWaittime () {return maxwaittime; } public static int getSumServetime () {return sumServetime; } @Override public void run () {flag = true; while (flag) {customerbean customer = customerquene.getCustomerQuene (). getCustomerBean (); // Если поток клиента был закрыт, и в очереди нет клиентов, поток службы службы закрывается и выпускает if (customer == null) {if (! Customerquene.getCustomerQuene (). Isflag ()) {flag = false; print (); } продолжать; } long Now = System.currentTimeMillis (); int wailtime = (int) (теперь - customer.getarriveTime ()); // Сохранить максимальное время ожидания, если (waftime> maxwaittime) {maxwaittime = wailtime; } // Время сна - это время обслуживания клиента, которое представляет собой попытку клиента } catch (Exception e) {e.printstackTrace (); } System.err.println (имя + «Время для обслуживания клиентов:« + customer.getServetime () + "MS/T клиент ожидание:" + wailTime + "ms"); Customernum ++; sumwaittime += waftime; sumservetime += customer.getServetime (); }} public static void print () {if (customernum> 0) { System.out.println ("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- // Вывод среднее время ожидания клиента и сохранить два десятичных местах System.out.println («Среднее время ожидания для клиентов:». Customernum), 2) + "MS"); 4) Проверьте модель
/ ** *@Описание: */ package com.lulei.opsearch.quene; импортировать java.util.concurrent.timeUnit; открытый тест класса {public static void main (string [] args) {// открыть дверной систему.out.println («Откройте дверь и возьмите клиентов!»); логический флаг = true; Customerquene.getCustomerQuene (); long a = system.currenttimemillis (); int serviceNum = 10; for (int i = 0; i <serviceNum; i ++) {ServantThread Thread = New ServantThread ("Служба"+I); Thread.Start (); } while (flag) {long b = System.currentTimeMiMillis (); if (b - a> 1 * 60 * 1000 && flag) {// close flag = false; Customerquene.getCustomerQuene (). Close (); System.out.println («Закройте дверь и не забирайте клиентов!»); } System.out.println ("Системная время выполнения:" + (b -a) + "ms"); System.out.println ("Системное время простоя:" + ((b -a) * Servantnum - ServantThread.getSumServetime ())); ServantThread.print (); try {timeUnit.seconds.sleep (2); } catch (Exception e) {e.printstackTrace (); }}}}Выше приведено подробное введение в принципы Java, внедряющую теорию очередей. Я надеюсь, что это будет полезно для каждого обучения.