排队叫号功能

简介

排队叫号功能在很多场景下都非常实用,比如医院门诊、银行柜台、机场登机等等。这种功能可以让用户按顺序进行服务,避免了混乱和争抢的情况。

在本文中,我们将使用Java编程语言来实现一个简单的排队叫号功能。我们将使用队列(Queue)数据结构来保存用户的叫号顺序,并使用多线程来模拟用户叫号和服务过程。

实现

我们首先定义一个名为QueueService的类来实现排队叫号功能。该类中包含以下几个方法:

  • enqueue(int number):将用户的号码加入队列的末尾。
  • dequeue():从队列的头部取出一个号码。
  • getSize():获取当前队列的长度。

我们可以使用LinkedList作为队列的实现,代码如下所示:

import java.util.LinkedList;
import java.util.Queue;

public class QueueService {
    private Queue<Integer> queue;

    public QueueService() {
        queue = new LinkedList<>();
    }

    public synchronized void enqueue(int number) {
        queue.add(number);
    }

    public synchronized int dequeue() {
        return queue.poll();
    }

    public int getSize() {
        return queue.size();
    }
}

在上述代码中,我们使用synchronized关键字来保证多线程环境下的线程安全性。

接下来,我们创建一个名为UserService的类,用于模拟用户的叫号和服务过程。我们创建了一个QueueService对象,并在run()方法中使用enqueue()方法向队列中添加号码,并使用dequeue()方法取出号码进行服务,代码如下所示:

public class UserService implements Runnable {
    private QueueService queueService;

    public UserService(QueueService queueService) {
        this.queueService = queueService;
    }

    @Override
    public void run() {
        for (int i = 1; i <= 10; i++) {
            queueService.enqueue(i);
            System.out.println("User " + i + " is waiting.");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        while (queueService.getSize() > 0) {
            int number = queueService.dequeue();
            System.out.println("User " + number + " is being served.");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

run()方法中,我们使用一个循环向队列中添加号码,并在每次添加后等待1秒钟。然后,我们使用另一个循环从队列中取出号码进行服务,并在每次服务后等待2秒钟。

最后,我们创建一个名为Main的类,用于启动程序。在main()方法中,我们创建一个QueueService对象和两个UserService对象,并使用Thread类来创建两个线程,然后启动这两个线程,代码如下所示:

public class Main {
    public static void main(String[] args) {
        QueueService queueService = new QueueService();
        UserService userService1 = new UserService(queueService);
        UserService userService2 = new UserService(queueService);

        Thread thread1 = new Thread(userService1);
        Thread thread2 = new Thread(userService2);

        thread1.start();
        thread2.start();
    }
}

序列图

下面是一个基于Mermaid语法的序列图,展示了用户叫号和服务的过程:

sequenceDiagram
    participant User1
    participant User2
    participant QueueService

    User1->>QueueService: enqueue(1)
    User2->>QueueService: enqueue(2)
    User1->>QueueService: enqueue(3)
    User2->>QueueService: enqueue(4)
    User1->>QueueService: enqueue(5)
    User2->>QueueService: enqueue(6)
    User1->>QueueService: enqueue(7)
    User2->>QueueService: enqueue(8)
    User1->>QueueService: enqueue(9)
    User2->>QueueService: enqueue(10)
    User1->>QueueService: dequeue()
    QueueService->>User1: User 1 is being served.
    User2->>QueueService: dequeue()
    QueueService->>User2: User 2 is being served.
    User1->>QueueService: dequeue()
    QueueService->>User1: User