Java——某公司组织年会,会议入场时有两个入口,在入场时每位员工都能获取一张双色球彩票,假设公司有100个员工,利用多线程模拟年会入场过程

某公司组织年会,会议入场时有两个入口,在入场时每位员工都能获取一张双色球彩票,假设公司有100个员工,利用多线程模拟年会入场过程,
并分别统计每个入口入场的人数,以及每个员工拿到的彩票的号码。线程运行后打印格式如下:
编号为: 2 的员工 从后门 入场! 拿到的双色球彩票号码是: [17, 24, 29, 30, 31, 32, 07]
编号为: 1 的员工 从后门 入场! 拿到的双色球彩票号码是: [06, 11, 14, 22, 29, 32, 15]
//…
从后门入场的员工总共: 13 位员工
从前门入场的员工总共: 87 位员工

代码实现:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class DoubleColorBall {
    public static void main(String[] args) {
        Enter enter = new Enter();
        new Thread(enter,"后门").start();
        new Thread(enter,"前门").start();
    }

}
//创建入场类
class Enter implements Runnable {
    private int employeeNum = 100;//员工人数,也是编号
    private int frontNum = 0;//前门人数
    private int backNum = 0;//后门人数

    public void run() {
        while (employeeNum > 0) {
            synchronized (this) {
                count();
            }
        }
    }

        public void count () {
            List<Integer> employeeNumList = new ArrayList<>();//存储员工编号
            List<String> ballList = new ArrayList<>();//存储双色球
            String ball = ball();

            try {
                Thread.sleep(50);
            } catch (Exception e) {
                System.out.println(e);
            }
            if (!employeeNumList.contains(employeeNum) && !ballList.contains(ball)) {
                ballList.add(ball);
                employeeNumList.add(employeeNum);

                if (employeeNum == 0) {
                    System.out.println("从后门入场的员工总共:" + backNum);
                    System.out.println("从前门入场的员工总共:" + frontNum);
                    return;
                }
                String name = Thread.currentThread().getName();//获取线程名
                if (name.equals("前门")) {
                    System.out.println("编号为: " + employeeNum + " 的员工 从" + name + " 入场!拿到的双色球号码是:[" + ball + "]");
                    frontNum++;
                } else if (name.equals("后门")) {
                    System.out.println("编号为: " + employeeNum + " 的员工 从" + name + " 入场!拿到的双色球号码是:[" + ball + "]");
                    backNum++;
                }
                employeeNum--;
            }
        }

        public String ball () {
            //双色球是由六个红色球组编号和一个蓝色球组编号,且双色球编号是唯一的,不能重复

            //红色球数组
            String[] redBall = {"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[] blueBall = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16"};

            int cnt = 0;//循环次数
            String redColor = "";
            while (cnt < 6) {
           		 //循环随机抽取6组红色球
                redColor += redBall[new Random().nextInt(redBall.length)] + ",";
                cnt++;
            }
            //将红色球编号和蓝色球编号组合成双色球编号
            String doubleColor = redColor + blueBall[new Random().nextInt(blueBall.length)];
            return doubleColor;
        }
}

输出结果:在这里插入图片描述
一开始我以为我写错了,因为输出的都是后门,但是多运行几次就好了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值