当前位置:首页 > Java

java如何叫号

2026-03-19 22:53:13Java

叫号系统的实现方法

在Java中实现叫号系统,可以通过多线程和队列管理来模拟实际场景。以下是几种常见的实现方式:

基于队列的叫号系统

使用Queue接口及其实现类LinkedList来管理排队号码:

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

public class NumberCallSystem {
    private Queue<Integer> queue = new LinkedList<>();
    private int currentNumber = 1;

    public synchronized int getNumber() {
        queue.offer(currentNumber);
        return currentNumber++;
    }

    public synchronized Integer callNext() {
        return queue.poll();
    }
}

多线程叫号系统

模拟多个服务窗口同时叫号的场景:

public class TicketWindow implements Runnable {
    private NumberCallSystem system;

    public TicketWindow(NumberCallSystem system) {
        this.system = system;
    }

    @Override
    public void run() {
        while(true) {
            Integer number = system.callNext();
            if(number != null) {
                System.out.println(Thread.currentThread().getName() + " calling: " + number);
            }
            try {
                Thread.sleep(1000); // 模拟处理时间
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

使用线程池管理

通过线程池管理多个叫号窗口:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {
    public static void main(String[] args) {
        NumberCallSystem system = new NumberCallSystem();
        ExecutorService executor = Executors.newFixedThreadPool(3); // 3个窗口

        for(int i=0; i<3; i++) {
            executor.execute(new TicketWindow(system));
        }

        // 模拟用户取号
        for(int i=0; i<10; i++) {
            System.out.println("New ticket: " + system.getNumber());
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

高级功能实现

优先级叫号系统

为特殊客户(如VIP)实现优先叫号:

import java.util.PriorityQueue;

public class PriorityNumberCallSystem {
    private PriorityQueue<Customer> queue = new PriorityQueue<>();
    private int currentNumber = 1;

    public synchronized int getNumber(boolean isVip) {
        Customer customer = new Customer(currentNumber++, isVip);
        queue.offer(customer);
        return customer.number;
    }

    public synchronized Customer callNext() {
        return queue.poll();
    }

    class Customer implements Comparable<Customer> {
        int number;
        boolean isVip;

        public Customer(int number, boolean isVip) {
            this.number = number;
            this.isVip = isVip;
        }

        @Override
        public int compareTo(Customer other) {
            if(this.isVip && !other.isVip) return -1;
            if(!this.isVip && other.isVip) return 1;
            return Integer.compare(this.number, other.number);
        }
    }
}

数据库持久化

将排队信息保存到数据库:

java如何叫号

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class DatabaseNumberCallSystem {
    private Connection conn;

    public DatabaseNumberCallSystem() throws Exception {
        conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/queue_db", "user", "password");
    }

    public int getNumber() throws Exception {
        PreparedStatement stmt = conn.prepareStatement("INSERT INTO queue (status) VALUES ('waiting')", PreparedStatement.RETURN_GENERATED_KEYS);
        stmt.executeUpdate();
        ResultSet rs = stmt.getGeneratedKeys();
        if(rs.next()) {
            return rs.getInt(1);
        }
        return -1;
    }

    public Integer callNext() throws Exception {
        PreparedStatement stmt = conn.prepareStatement("SELECT id FROM queue WHERE status='waiting' ORDER BY id LIMIT 1");
        ResultSet rs = stmt.executeQuery();
        if(rs.next()) {
            int id = rs.getInt("id");
            PreparedStatement updateStmt = conn.prepareStatement("UPDATE queue SET status='processing' WHERE id=?");
            updateStmt.setInt(1, id);
            updateStmt.executeUpdate();
            return id;
        }
        return null;
    }
}

这些实现方式可以根据实际需求进行组合和扩展,构建适合不同场景的叫号系统。

标签: java
分享给朋友:

相关文章

java如何删除文件

java如何删除文件

删除文件的基本方法 使用 java.io.File 类的 delete() 方法可以删除文件。如果文件存在且删除成功,返回 true;否则返回 false。 import java.io.Fil…

java如何获取当前时间

java如何获取当前时间

获取当前时间的方法 在Java中,可以通过多种方式获取当前时间。以下是几种常见的方法: 使用 java.util.Date Date currentDate = new Date(); Syste…

如何阅读java源码

如何阅读java源码

阅读Java源码的方法 选择合适的源码项目 初学者建议从JDK核心类库(如java.lang、java.util)或知名开源项目(如Spring、Guava)入手。选择文档完善、社区活跃的项目能降低理…

如何启用java

如何启用java

启用 Java 的方法 检查 Java 是否已安装 在命令行或终端输入 java -version,如果显示版本信息,说明 Java 已安装。若未安装,需从 Oracle 官网 或 OpenJDK 下…

java如何返回数组

java如何返回数组

返回数组的方法 在Java中,可以通过多种方式返回数组。以下是几种常见的方法: 直接返回数组 定义一个方法,返回类型为数组类型,直接在方法内部创建并返回数组。 public int[] getI…

java如何调用另一个类的方法

java如何调用另一个类的方法

调用另一个类的方法 在Java中调用另一个类的方法,通常需要创建该类的对象或直接通过类名调用(静态方法)。以下是几种常见的方式: 通过对象实例调用实例方法 创建一个目标类的对象,通过对象调用其方法。…