//示例代码如下,仅供参考

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 著作权归作者所有。请勿转载和采集!

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