Java 多线程模拟年会入场:双色球彩票领取

本示例使用 Java 多线程模拟年会入场场景,每个员工随机从两个入口入场,并领取一张双色球彩票,最终统计每个入口入场人数以及每个员工的彩票号码。

代码实现:

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

public class YearEndParty {
    public static void main(String[] args) {
        int totalEmployees = 100; // 公司总人数
        int entrance1Count = 0; // 入口1入场人数
        int entrance2Count = 0; // 入口2入场人数
        Object lock1 = new Object(); // 入口1锁
        Object lock2 = new Object(); // 入口2锁

        for (int i = 1; i <= totalEmployees; i++) {
            int entrance = i % 2 == 0 ? 2 : 1; // 偶数从入口2,奇数从入口1
            String lottery = DoubleColorBallUtil.create(); // 生成彩票号码

            // 创建线程,模拟员工入场
            new Thread(() -> {
                if (entrance == 1) {
                    synchronized (lock1) {
                        entrance1Count++;
                        System.out.println('编号为:' + i + ' 的员工从前门入场!拿到的双色球彩票号码是:' + lottery);
                    }
                } else {
                    synchronized (lock2) {
                        entrance2Count++;
                        System.out.println('编号为:' + i + ' 的员工从后门入场!拿到的双色球彩票号码是:' + lottery);
                    }
                }
            }).start();
        }

        // 等待所有员工入场完成
        while (entrance1Count + entrance2Count < totalEmployees) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        // 打印入场人数统计结果
        System.out.println('从前门入场的员工总共:' + entrance1Count + ' 位员工');
        System.out.println('从后门入场的员工总共:' + entrance2Count + ' 位员工');
    }
}

class DoubleColorBallUtil {
    // 产生双色球的代码
    public static String create() {
        String[] red = { '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' };
        // 创建蓝球
        String[] blue = '01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16'.split(',');
        boolean[] used = new boolean[red.length];
        Random r = new Random();
        String[] all = new String[7];
        for (int i = 0; i < 6; i++) {
            int idx;
            do {
                idx = r.nextInt(red.length);// 0‐32
            } while (used[idx]);// 如果使用了继续找下一个
            used[idx] = true;// 标记使用了
            all[i] = red[idx];// 取出一个未使用的红球
        }
        all[all.length - 1] = blue[r.nextInt(blue.length)];
        Arrays.sort(all);
        return Arrays.toString(all);
    }
}

代码解析:

  1. 创建线程模拟入场: 循环创建100个线程,每个线程模拟一个员工,随机分配入场入口(前门或后门),并生成一个双色球彩票号码。
  2. 使用锁保证线程安全: 使用 synchronized 关键字和两个锁 lock1lock2,分别控制前门和后门的入场计数,确保线程安全。
  3. 统计入场人数: 每个线程入场后,对应入口的计数器加1。
  4. 等待所有线程完成: 使用 while 循环,等待所有员工入场完成后再打印统计结果。

运行结果:

// 随机输出员工入场信息和彩票号码
// ...
从前门入场的员工总共:50 位员工
从后门入场的员工总共:50 位员工

注意:

  • 双色球彩票号码生成逻辑使用 DoubleColorBallUtil 类,可以根据需要修改。
  • 本示例仅模拟入场过程,不涉及真实彩票购买和中奖功能。

总结:

本示例使用 Java 多线程技术,模拟了年会入场场景,并统计每个入口入场人数以及每个员工的彩票号码,展示了多线程在模拟现实场景中的应用。


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

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