多线程模拟年会入场,统计员工入场人数和彩票号码
多线程模拟年会入场,统计员工入场人数和彩票号码
假设某公司组织年会,会议入场时有两个入口,在入场时每位员工都能获取一张双色球彩票。假设公司有 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_BALLS和BLUE_BALLS数组定义了双色球彩票的红球和蓝球号码。 - 代码中的
TOTAL_EMPLOYEES变量定义了公司员工总数,可以根据实际情况修改。 - 代码中的
ENTRY_NUM变量定义了入场入口数量,可以根据实际情况修改。
总结:
本代码使用多线程模拟了年会入场场景,并统计了每个入口入场人数以及每个员工拿到的彩票号码。该代码可以帮助你理解多线程的使用以及线程安全的问题。
原文地址: https://www.cveoy.top/t/topic/ofgA 著作权归作者所有。请勿转载和采集!