首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java中的并发编程。尝试模拟一组结账计数器

Java中的并发编程。尝试模拟一组结账计数器
EN

Stack Overflow用户
提问于 2018-10-19 18:45:00
回答 2查看 675关注 0票数 0

我正在尝试使用Java来模拟购物中心中的一组收银台。

这是假设。有5个结账柜台。就像真正的购物中心一样,每个柜台都有一条长队。每个柜台一次为一个顾客服务。

我尝试按如下方式实现:

  1. 每个客户都是一个运行线程的类,类似于生产者-消费者问题中的生产者。客户是阻塞队列的一部分。不知何故,我需要一组阻塞队列来模拟5个收银台前的5行。如何实现这一点。
  2. 结帐计数器已被定义为单线程执行器服务。因此,现在将有5个执行器,一次服务于一个(生产者)线程。我已经定义了一个执行器数组列表来模拟这组5个线程。
  3. 在计数器上,执行器服务每次执行对应队列中的一个线程(即,使用者正在使用生产者产生的内容)。

我的逻辑正确吗?

我有一些代码,但我不确定这段代码是否正确执行了我的逻辑。

请帮帮忙。干杯..

代码:

Checkout.java

代码语言:javascript
复制
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

代码语言:javascript
复制
    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

代码语言:javascript
复制
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");
    }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-20 04:45:46

您的模拟可能需要考虑更多的功能。例如,您可能需要考虑以下部分或全部设计注意事项:

客户

每个客户都有以下特征

  • 要购买的一组项目。
    • 所有物料都是在单个事务处理中购买的,而不是一次购买一个。
    • 单个事务处理中可能有0..*个物料。
    • 0物料事务处理会导致收到$0.00.

  • 客户到达结账行的时间
  • 完成结帐的时间采购事务处理(即接收)的时间

签出计数器

每个结帐计数器都具有以下特征

  • 等待结账的客户队列。
  • 队列可能有0..*等待结账的客户
  • 在进入结帐队列之前,队列中的客户计数可供每个客户使用
  • 在结账队列中一次,所有客户都会留在该队列中,直到他们的交易是柜台ID
  • 商店开张以来提供服务的客户计数

代码语言:javascript
复制
- A 0 item transaction does not increment the tally of customers served

  • 由结账柜台

处理的所有销售总额

商店库存

可供购买的项目集是商店库存。每一项都有以下特征

  • Item Id
  • Item cost

客户需要购买的项目集仅包含每个项目的项目ID。特定项目ID可能会在客户选择购买的项目列表中出现不止一次。

票数 0
EN

Stack Overflow用户

发布于 2018-10-19 19:08:38

我的逻辑如下:

  1. 像它自己的线程一样写结账计数器
  2. 像普通列表一样写行(客户行)。它不必是BlockingDeque,因为每个结帐计数器都处理它自己的行。

这样,它的工作方式就像真正的超市一样,每个收银台都处理自己的队列。

基于此,我认为编写代码应该更符合逻辑。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52890801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档