多线程模拟年会入场,统计员工入场人数和彩票号码

假设某公司组织年会,会议入场时有两个入口,在入场时每位员工都能获取一张双色球彩票。假设公司有 100 个员工,利用多线程模拟年会入场过程,并分别统计每个入口入场的人数,以及每个员工拿到的彩票的号码。

线程运行后打印格式如下:

1 编号为: 2 的员工 从后门 入场! 拿到的双色球彩票号码是:[17, 24, 29, 30, 31, 32, 07] 2 编号为: 1 的员工 从后门 入场! 拿到的双色球彩票号码是:[06, 11, 14, 22, 29, 32, 15] 3 //..... 4 从后门入场的员工总共: 13 位员工 5 从前门入场的员工总共: 87 位员工

代码实现:

import java.util.Arrays;
import java.util.Random;

public class Entrance implements Runnable {
    private static final int TOTAL_EMPLOYEES = 100;
    private static final int TICKET_NUM = 7;
    private static final int TICKET_NUM_RED = 6;
    private static final int TICKET_NUM_BLUE = 1;

    private static final String[] RED_BALLS = { '01', '02', '03', '04', '05', '06', '07',
                                                '08', '09', '10', '11', '12', '13', '14',
                                                '15', '16', '17', '18', '19', '20', '21',
                                                '22', '23', '24', '25', '26', '27', '28',
                                                '29', '30', '31', '32', '33' };
    private static final String[] BLUE_BALLS = { '01', '02', '03', '04', '05', '06', '07',
                                                '08', '09', '10', '11', '12', '13', '14',
                                                '15', '16' };
    private static final int ENTRY_NUM = 2;

    private int entryId;
    private int count;
    private int[] ticketNums;

    public Entrance(int entryId) {
        this.entryId = entryId;
        this.count = 0;
        this.ticketNums = new int[TICKET_NUM];
    }

    @Override
    public void run() {
        synchronized (Entrance.class) {
            while (count < TOTAL_EMPLOYEES) {
                int id = count + 1;
                count++;
                String[] ticket = createTicket();
                System.out.println(String.format("%d 编号为: %d 的员工 从%s门 入场! " +
                                    "拿到的双色球彩票号码是:%s", count, id,
                                    entryId == 1 ? "前" : "后", Arrays.toString(ticket)));
                ticketNums[0] += Integer.parseInt(ticket[0]);
                ticketNums[1] += Integer.parseInt(ticket[1]);
                ticketNums[2] += Integer.parseInt(ticket[2]);
                ticketNums[3] += Integer.parseInt(ticket[3]);
                ticketNums[4] += Integer.parseInt(ticket[4]);
                ticketNums[5] += Integer.parseInt(ticket[5]);
                ticketNums[6] += Integer.parseInt(ticket[6]);
            }
            System.out.println(String.format("从%s门入场的员工总共: %d 位员工", 
                                    entryId == 1 ? "前" : "后", count));
            System.out.println(String.format("拿到红球1的员工 %d 位", ticketNums[0]));
            System.out.println(String.format("拿到红球2的员工 %d 位", ticketNums[1]));
            System.out.println(String.format("拿到红球3的员工 %d 位", ticketNums[2]));
            System.out.println(String.format("拿到红球4的员工 %d 位", ticketNums[3]));
            System.out.println(String.format("拿到红球5的员工 %d 位", ticketNums[4]));
            System.out.println(String.format("拿到红球6的员工 %d 位", ticketNums[5]));
            System.out.println(String.format("拿到蓝球的员工 %d 位", ticketNums[6]));
        }
    }

    private String[] createTicket() {
        String[] ticket = new String[TICKET_NUM];
        boolean[] used = new boolean[RED_BALLS.length];
        Random r = new Random();
        for (int i = 0; i < TICKET_NUM_RED; i++) {
            int idx;
            do {
                idx = r.nextInt(RED_BALLS.length);
            } while (used[idx]);
            used[idx] = true;
            ticket[i] = RED_BALLS[idx];
        }
        ticket[TICKET_NUM - 1] = BLUE_BALLS[r.nextInt(BLUE_BALLS.length)];
        Arrays.sort(ticket, 0, TICKET_NUM_RED);
        return ticket;
    }

    public static void main(String[] args) {
        Entrance e1 = new Entrance(1);
        Entrance e2 = new Entrance(2);
        Thread t1 = new Thread(e1);
        Thread t2 = new Thread(e2);
        t1.start();
        t2.start();
    }
}

代码说明:

  • Entrance 类:
    • 使用了 synchronized 关键字来保证线程安全,确保每个员工都能够获取到唯一的编号和彩票号码。
    • createTicket() 方法负责生成随机的双色球彩票号码,并保证红球号码不重复。
    • run() 方法模拟员工入场过程,记录每个入口的入场人数以及每个员工拿到的彩票号码。
  • main 方法:
    • 创建两个 Entrance 对象分别代表两个入口。
    • 创建两个线程,分别启动两个入口的模拟入场过程。

运行结果:

代码运行后,会输出每个员工入场时的信息,以及每个入口入场人数的统计结果,以及每个员工拿到的彩票号码统计。

注意:

  • 代码中的 RED_BALLSBLUE_BALLS 数组定义了双色球彩票的红球和蓝球号码。
  • 代码中的 TOTAL_EMPLOYEES 变量定义了公司员工总数,可以根据实际情况修改。
  • 代码中的 ENTRY_NUM 变量定义了入场入口数量,可以根据实际情况修改。

总结:

本代码使用多线程模拟了年会入场场景,并统计了每个入口入场人数以及每个员工拿到的彩票号码。该代码可以帮助你理解多线程的使用以及线程安全的问题。

多线程模拟年会入场,统计员工入场人数和彩票号码

原文地址: https://www.cveoy.top/t/topic/ofgA 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录