Как вы показываете время после завершения потоков в Java? - PullRequest
1 голос
/ 06 мая 2020

Мне нужно смоделировать время, необходимое нескольким клиентам, чтобы воспользоваться раздевалкой. Мои входные данные - это количество раздевалок, количество клиентов и количество предметов (ввод 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);

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...