某公司组织年会,会议入场时有两个入口,在入场时每位员工都能获取一张双色球彩票,假设公司有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;
}
}
输出结果:
一开始我以为我写错了,因为输出的都是后门,但是多运行几次就好了