java:题目51 某公司组织年会会议入场时有两个入口 在入场时每位员工都能获取一张双色球彩票假设公司有100个员工 利用多线程模拟年会入场过程并分别统计每个入口入场的人数以及每个员工拿到的彩票的号码。线程运行后打印 格式如下:1 编号为 2 的员工 从后门 入场! 拿到的双色球彩票号码是17 24 29 3031 32 072 编号为 1 的员工 从后门 入场! 拿到的双色球彩票号码是06 11
//示例代码如下,仅供参考
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.ArrayList; import java.util.List;
public class AnnualMeeting {
private static final int EMPLOYEE_NUM = 100; // 员工数量
private static final int GATE_NUM = 2; // 入口数量
private static final int TICKET_NUM = 7; // 彩票号码数量
private static List<String> ticketList = new ArrayList<>(); // 存储彩票号码
private static Lock ticketLock = new ReentrantLock(); // 彩票号码锁
public static void main(String[] args) {
for (int i = 1; i <= EMPLOYEE_NUM; i++) {
new Thread(new Employee(i)).start(); // 开启员工线程
}
}
static class Employee implements Runnable {
private int id; // 员工编号
public Employee(int id) {
this.id = id;
}
@Override
public void run() {
int gate = (int) (Math.random() * GATE_NUM) + 1; // 随机选择入口
String ticket = DoubleColorBallUtil.create(); // 生成彩票号码
ticketLock.lock(); // 加锁
try {
ticketList.add(ticket); // 存储彩票号码
} finally {
ticketLock.unlock(); // 解锁
}
System.out.println("编号为: " + id + " 的员工从" + (gate == 1 ? "前门" : "后门") + "入场! 拿到的双色球彩票号码是:" + ticket);
if (gate == 1) {
Entrance.countGate1(); // 统计进入前门的员工数量
} else {
Entrance.countGate2(); // 统计进入后门的员工数量
}
}
}
static class Entrance {
private static int gate1Count = 0; // 进入前门的员工数量
private static int gate2Count = 0; // 进入后门的员工数量
public static synchronized void countGate1() {
gate1Count++;
if (gate1Count == EMPLOYEE_NUM) {
printCount();
}
}
public static synchronized void countGate2() {
gate2Count++;
if (gate2Count == EMPLOYEE_NUM) {
printCount();
}
}
private static void printCount() {
System.out.println("从前门入场的员工总共: " + gate1Count + " 位员工");
System.out.println("从后门入场的员工总共: " + gate2Count + " 位员工");
System.out.println("彩票号码列表: " + ticketList.toString());
}
}
}
// DoubleColorBallUtil 类不变,略
原文地址: http://www.cveoy.top/t/topic/fqqk 著作权归作者所有。请勿转载和采集!