Мне нужно смоделировать время, необходимое нескольким клиентам, чтобы воспользоваться раздевалкой. Мои входные данные - это количество раздевалок, количество клиентов и количество предметов (ввод 0 здесь выбирает случайное количество предметов для каждого покупателя). Если покупатель ждет, он войдет, когда другой уйдет. Мне нужно сообщить общее количество элементов и общее время, которое потребуется для всех клиентов.
Требования:
1. Конструктор, который устанавливает количество комнат.
2. Семафор для управления доступ к комнатам.
3. Метод requestRoom, который ожидает и получает доступ к комнате.
4. Клиент будет реализован как поток.
5. У каждого клиента будет 1-6 элементов, которые потратьте 1-3 минуты на примерку.
6. Сценарий будет принимать количество комнат и клиентов
Приведенный ниже код позволяет покупателям начать примерку своих предметов и после завершения покинуть комнату. Если клиентов больше, чем комнат, дополнительные клиенты будут ждать открытия комнаты. Однако я не могу отобразить время, необходимое для всего процесса. Время будет напечатано 0 перед запуском любого из потоков. Я попытался использовать службу исполнителя для завершения работы и ожидания завершения, где находится cust.start (). Это позволяет таймеру печатать после того, как это сделано, но не позволяет нескольким клиентам примерить свои товары одновременно. Есть предложения?
Спасибо!
import java.time.Duration;
import java.time.Instant;
import java.util.Random;
import java.util.Scanner;
import java.util.concurrent.Semaphore;
public class IT481_Norman_Unit6 {
public static void main(String[] args) {
int numRooms =3;
int numCus;
int numItems =3;
String scenario;
Scanner input = new Scanner (System.in);
System.out.print("Input the number of dressing rooms for this scenario: ");
int numRooms = input.nextInt();
System.out.println("");
System.out.print("Input the number of customers for this scenario: ");
int numCus = input.nextInt();
System.out.println("");
System.out.print("Input the number of items each customer has for this scenario \n (a value of 0 will pick a random number): ");
int numItems = input.nextInt();
System.out.println("");
input.close();
System.out.println("");
System.out.println("Here are the results for secenario " + scenario + ".");
System.out.println("This scenario has " + numCus + " customers.");
System.out.println("This scenario has " + numRooms + " rooms.");
if (numItems != 0)
System.out.println("Total number of items: " + numCus * numItems);
else
System.out.println("This scenario is using a random number of items. ");
System.out.println("");
long startTime = System.currentTimeMillis();
Scenario.scenario(numRooms, numCus, numItems);
long endTime = System.currentTimeMillis();
long totalTime;
totalTime = (endTime - startTime)/1000;
System.out.println("Total time passed:" + totalTime + " seconds.");
System.out.println("");
}
}
class Customer {
private final static Random NumTimeGen = new Random();
private static int timeMin = 1;
private static int timeMax = 3;
public int time = 0;
public static Thread cust;
public Customer(Semaphore roomAvail, int items, int customer) {
cust = new Thread(new Runnable() {
public void run() {
int numOfItems;
if (items == 0)
numOfItems = new Random().nextInt(6-1+1) + 1 ;
else
numOfItems = items;
System.out.println("Customer " + (customer + 1) + " has " + numOfItems + " items.");
try{
roomAvail.acquire();
}
catch (InterruptedException e){
System.out.println( "received interuptedexception" );
}
System.out.println("Customer " + (customer + 1) + " got a room.");
for(int j = 1; j <= numOfItems; j++) {
Instant start = Instant.now();
try {
int sleepTime = NumTimeGen.nextInt(timeMax*60*1000/10/30-timeMin*60*1000/10/30) + timeMin*60*1000/10/30;
time = time + sleepTime;
Thread.sleep(sleepTime);
}
catch (InterruptedException e) {
e.printStackTrace();
}
Instant finish = Instant.now();
long timeElapsed = Duration.between(start, finish).toMillis();
System.out.println("Customer " + (customer + 1) + " is trying on clothing item Number " + j + " ,time spent: " + timeElapsed);
}
roomAvail.release();
System.out.println("Customer " + (customer + 1) + " left.");
}
});
cust.start();
}
}
class Scenario {
public static void scenario(int rooms, int customers, int items) {
DressingRooms dressingRooms = new DressingRooms(rooms);
Semaphore availableRooms = dressingRooms.numOfRooms;
for (int i=0; i < customers; i++) {
DressingRooms.requestRoom(availableRooms, i, items);
}
}
}
class DressingRooms {
Semaphore numOfRooms;
public DressingRooms() {
numOfRooms = new Semaphore(3);
}
public DressingRooms(int rooms) {
numOfRooms = new Semaphore(rooms);
}
public static synchronized void requestRoom(Semaphore totalRooms, int custNum, int items) {
Customer customer = new Customer(totalRooms, items, custNum);
}
}