Параллельное программирование на Java.Попытка смоделировать набор счетчиков - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь использовать Java для имитации набора счетчиков Checkout в торговом центре.

Это предположение.Есть 5 кассовых прилавков.Как настоящий торговый центр, у каждого прилавка есть линия.Каждый счетчик обслуживает одного клиента за раз.

Я пытался реализовать это следующим образом:

  1. Каждый клиент - это класс, который запускает поток, аналогичный производителю впроблема производитель-потребитель.Клиенты являются частью блокировки блока.Мне как-то понадобится набор блокирующих очередей для имитации 5 строк перед 5 счетчиками проверки.Как мне этого добиться.

  2. Счетчики проверки были определены как однопотоковая служба исполнителя.Так что теперь будет 5 исполнителей, которые будут обслуживать один (продюсерский) поток за раз.Я определил массив исполнителей, чтобы смоделировать эту группу из 5.

  3. На счетчике один поток за раз из соответствующей очереди выполняется службой исполнителя (т. Е. Потребительпотребляя то, что производит производитель).

Правильна ли моя логика?

У меня есть код, но я не уверен, правильно ли моя логика была выполнена этим кодом.

Пожалуйста, помогите.Ура ..

код:

Checkout.java

package Supermarket;

import java.util.*;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class Checkout implements Runnable
{
    public BlockingQueue<Integer> item_queue = new ArrayBlockingQueue<Integer>(10);

    public int checkout_number;
    public int item;

    public Random random;

    public Checkout(int checkout_number, BlockingQueue<Integer> item_queue)
    {
        this.checkout_number = checkout_number;
        this.item_queue = item_queue;

        random = new Random();
        System.out.println("\nCheckout Counter Number: "+checkout_number);
    }

    public void run()
    {
        while(true)
        {           
            if(item == -1)
            {
                System.out.println("Consumer finished");
                break;
            }
            else
            {
                try 
                {
                    item = item_queue.take();
                } 
                catch (InterruptedException e) 
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                System.out.println("\nConsumer has taken item ==> "+item);
                System.out.println("Scanning item");

                try 
                {
                    Thread.sleep(random.nextInt(5000));
                } 
                catch (InterruptedException e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

}

Customer.java

    package Supermarket;

import java.util.*;
import java.util.concurrent.*;

public class Customer implements Runnable
{

    public int item;
    public int customer_number;
    public int i;
    public int item_count;

    public Random random = new Random();
    public BlockingQueue<Integer> item_queue = new ArrayBlockingQueue<Integer>(10);

    public Customer(int customer_number, BlockingQueue<Integer> item_queue)
    {
        this.customer_number = customer_number;
        this.item_queue = item_queue;
    }

    public void run()
    {
        item_count = random.nextInt(5);

        System.out.println("I am customer Number: "+customer_number+" and I have "+item_count+" items");

        for(i=0; i<item_count; i++)
        {
            try 
            {
                item_queue.put(random.nextInt(10));
            } 
            catch (InterruptedException e) 
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        try 
        {
            item_queue.put(-1);
        } 
        catch (InterruptedException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Driver.java

package Supermarket;

import java.util.concurrent.*;
import java.util.*;

public class Driver 
{
    public static BlockingQueue<Integer> item_queue = new ArrayBlockingQueue<Integer>(10);

    public static Random random = new Random();

    public static int customer_count;
    public static int checkout_count;
    public static int i;

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        customer_count = random.nextInt(4)+1;
//      checkout_count = 5;

        System.out.println("Total Number of Customers: "+customer_count+"\n");

            for(i=0; i<customer_count; i++)
            {
                Customer customer = new Customer(i+1, item_queue);
                Thread customer_thread = new Thread(customer);
                customer_thread.start();
            }

//          for(i=0; i<=checkout_count; i++)
//          {
//              Checkout checkout = new Checkout(1, item_queue);
//              Thread checkout_thread = new Thread(checkout);
//              checkout_thread.start();
//          }

//      System.out.println("\n\nProgram Terminates!\n\n");
    }

}

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

При моделировании может потребоваться учесть еще несколько функций.Например, вы можете рассмотреть некоторые или все из следующих конструктивных соображений:

Клиент

Каждый клиент имеет следующие характеристики

  • Набор предметов для покупки.
    • Все предметы приобретаются в одной транзакции, а не по одной за раз
    • В одной транзакции может быть 0 .. * предметов.
    • Транзакция из 0 предметоввыдается квитанция в размере 0,00 $
  • Идентификация клиента
  • Время прибытия на кассовую линию
  • Время завершенной транзакции проверки
  • Стоимость транзакции покупки (т.е. квитанция)

Счетчик проверки

Каждый счетчик проверки имеет следующие характеристики

  • Очередь для клиентов, ожидающих проверки.

  • В очереди может быть 0 .. * клиентов, ожидающих проверки

  • Количествоклиенты в очереди доступны каждому клиенту перед входом в очередь

  • Клиенты всегда выбирают самую короткую доступную очередь оформления заказа

  • Один раз в очереди оформления заказавсе клиенты остаются в этой очереди до тех пор, пока их транзакция не будет обслужена.

  • Идентификатор кассового аппарата

  • Число клиентов, обслуживаемых с момента открытия магазина

    • Транзакция с 0 предметами не увеличивает счетОбслуженных клиентов
  • Сумма всех продаж, обработанных кассовым аппаратом

Инвентарь магазина

Набор предметов, доступных для покупки, - это инвентарь магазина.Каждый предмет имеет следующие характеристики

  • Идентификатор товара

  • Стоимость товара

Набор предметовпокупатель покупает содержит только идентификатор товара для каждого товара.Определенный идентификатор товара может появляться более одного раза в списке товаров, которые клиент выбирает для покупки.

0 голосов
/ 19 октября 2018

Моя логика будет выглядеть следующим образом:

  1. Запишите счетчик проверки как его собственный поток
  2. Запишите строку (строку клиентов) как обычный список.Это не должно быть BlockingDeque, поскольку каждый кассовый аппарат обрабатывает свою собственную линию.

Таким образом, он будет работать как настоящий супермаркет, каждый кассовый счетчик обрабатывает свою собственную линию.

Исходя из этого, я думаю, что написание кода должно быть более логичным.

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