Java 多线程模拟年会入场:双色球彩票领取
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);
}
}
代码解析:
- 创建线程模拟入场: 循环创建100个线程,每个线程模拟一个员工,随机分配入场入口(前门或后门),并生成一个双色球彩票号码。
- 使用锁保证线程安全: 使用
synchronized关键字和两个锁lock1和lock2,分别控制前门和后门的入场计数,确保线程安全。 - 统计入场人数: 每个线程入场后,对应入口的计数器加1。
- 等待所有线程完成: 使用
while循环,等待所有员工入场完成后再打印统计结果。
运行结果:
// 随机输出员工入场信息和彩票号码
// ...
从前门入场的员工总共:50 位员工
从后门入场的员工总共:50 位员工
注意:
- 双色球彩票号码生成逻辑使用
DoubleColorBallUtil类,可以根据需要修改。 - 本示例仅模拟入场过程,不涉及真实彩票购买和中奖功能。
总结:
本示例使用 Java 多线程技术,模拟了年会入场场景,并统计每个入口入场人数以及每个员工的彩票号码,展示了多线程在模拟现实场景中的应用。
原文地址: https://www.cveoy.top/t/topic/ofgv 著作权归作者所有。请勿转载和采集!