银行排队系统-Java

题目描述

模拟银行柜台业务的办理逻辑,去银行办理业务时,银行有固定的柜台数量M。客户来银行办理业务,到达时间随机、业务办理时长随机。客户先取号,再等着排队叫号。为了保证公平,叫号时要按照排队顺序叫,不能插队。可以把柜台看作是消费者,而客户是生产者。为了保存客户的排队状态,需要使用一个先进先出的队列作为缓冲区。客户(生产者)来了以后,就进缓冲区排队。而每个柜台每办理完一个客户的业务,就从缓冲区中取出一个客户继续办理业务。为了真实模拟,我们假设在银行刚开门的时候,有一批排队在银行门口的人。等银行开门后,在某一时间,会有N个人前来银行办理业务。

【设计要求】

1.用程序模拟实现银行业务办理流程,初始的柜台数量,顾客,由手工输入完成。

2.将柜台看作是消费者进程,而客户是生产者进程,程序模拟进程的同步控制过程。

3.程序的输出为银行排队叫号的过程。

银行类

class Bank {
    private int M; // 柜台数量
    private int N; // 客户数量
    private Queue<Integer> queue; // 等待队列
    private Customer[] customers;// 客户组

    public Bank(int M, int N) {
        this.M = M;
        this.N = N;
        this.queue = new LinkedList<>();
        customers = new Customer[N];
        for (int i = 0; i < N; i++) {
            int arriveTime = new Random().nextInt(60) + 1;
            customers[i] = new Customer(arriveTime, new Random().nextInt(10) + 30,(char)('A' + i));
        }
        for (int i = 0; i < N; i++) {
            customers[i].setSort(i);
        }
    }

}

可以把柜台当做消费者,客户是生产者

消费者和生产者代码

public void produce() throws InterruptedException {
        int count = 0;
        while (count < N) {
            synchronized (this) {
                while (queue.size() == M) {
                    wait();
                }
                queue.offer(count);
                notifyAll();
                count++;
            }
        }
    }
    public void consume() throws InterruptedException {
        int count = 0;
        while (count < N) {
            synchronized (this) {
                while (queue.isEmpty()) {
                    wait();
                }
                int customerId = queue.poll();
                notifyAll();
                count++;
            }
        }
    }

顾客类

class Customer {
    private int arrivalTime;
    private double serviceTime;

    public Character getName() {
        return name;
    }
    
    private Character name;
    private int sort;
    public void setSort(int sort) {
        this.sort = sort;
    }
    public Customer(int arrivalTime, double serviceTime,Character name) {
        this.arrivalTime = arrivalTime;
        this.serviceTime = serviceTime;
        this.name = name;
    }
    public int getArrivalTime() {
        return arrivalTime;
    }
    public double getServiceTime() {
        return serviceTime;
    }

    public int getSort() {
        return sort;
    }
}

主函数开两个线程分别执行消费者和生产者,模拟银行排队

主方法

public static void main(String[] args) throws InterruptedException {
        int M,N;
        Scanner e = new Scanner(System.in);
        System.out.print("请输入银行柜台数量:");
        M = e.nextInt();
        System.out.print("请输入客户数量:");
        N = e.nextInt();

        Bank bank = new Bank(M, N);

        Thread producer = new Thread(() -> {
            try {
                bank.produce();
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        });

        Thread consumer = new Thread(() -> {
            try {
                bank.consume();
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        });
        producer.start();
        consumer.start();
        producer.join();
        consumer.join();
    }

运行结果

好的,以下是一个简单的银行排队系统Java代码示例: ```java import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class BankQueueSystem { public static void main(String[] args) { Queue<String> queue = new LinkedList<>(); Scanner scanner = new Scanner(System.in); while (true) { System.out.println("请输入需要办理的业务:"); String business = scanner.nextLine(); queue.offer(business); System.out.println("当前等待人数:" + queue.size()); System.out.println("是否继续排队?(y/n)"); String continueFlag = scanner.nextLine(); if ("n".equalsIgnoreCase(continueFlag)) { break; } } int i = 1; while (!queue.isEmpty()) { System.out.println("请" + i + "号客户办理业务:" + queue.poll()); System.out.println("当前等待人数:" + queue.size()); i++; } System.out.println("所有客户已办理完成"); } } ``` 这个排队系统使用了Java中的`Queue`接口实现,具体流程如下: 1. 创建一个`LinkedList`对象,作为排队系统的队列。 2. 通过`Scanner`类读取用户输入的业务,将业务添加到队列中。 3. 输出当前等待人数,并询问用户是否继续排队。 4. 如果用户选择不继续排队,则退出循环。 5. 当所有客户都已经进入队列后,循环遍历队列,依次为客户办理业务。 6. 输出当前等待人数,并将已经办理完成的客户从队列中移除。 7. 当队列为空时,输出所有客户已经办理完成。 当然,这只是一个简单的示例,实际的银行排队系统应该还需要考虑更多的因素,如排队优先级、业务处理时间等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值