2018.4.17 java多线程练习二模拟开场仪式进场

时间:2021-07-26 10:46:42

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

并分别统计每个入口入场的人数,以及每个员工拿到的彩票的号码。线程运行后打印格式如下:
编号为: 2 的员工 从后门 入场! 拿到的双色球彩票号码是: [17, 24, 29, 30, 31, 32, 07]
编号为: 1 的员工 从后门 入场! 拿到的双色球彩票号码是: [06, 11, 14, 22, 29, 32, 15]
//.....
从后门入场的员工总共: 13 位员工
从前门入场的员工总共: 87 位员工

package com.lanqiao.demo9;

/**
 * 在测试类中主要是实例化子进程  创建进程
 * 启动进程 不要调用run'方法 start 
 * 
 * @author qichunlin
 *
 */
public class Test {
    public static void main(String[] args) {
        // 实例化子进程
        myThread mt = new myThread();

        // 创建进程
        Thread t1 = new Thread(mt, "前门");
        Thread t2 = new Thread(mt, "后门");
        // 启动进程
        t1.start();
        t2.start();
    }
}
package com.lanqiao.demo9;

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

/**
 *  进场类
 * @author qichunlin
 *
 */
public class Entering implements Runnable {

    // 前门人数
    private int frontNum = 0;
    // 后门人数
    private int backNum = 0;
    // 总人数
    private int person = 100;

    @Override
    public void run() {
        // 线程体
        // 1、统计人数
        while (true) {
            synchronized (this) {
                try {
                    Thread.sleep(10);
                    // 获取线程名称
                    String threadName = Thread.currentThread().getName();
                    // 1-1:总人数<0,退出循环
                    if (person < 0) {
                        return;
                    }
                    // 1-2:总人数>0,
                    if (person > 0) {
                        // 统计前门人数
                        if ("前门".equals(threadName)) {
                            System.out.println("编号为: "+(100-person+1)+" 的员工 从前门 入场!拿到的双色球彩票号码是: "+this.show());
                            frontNum++;
                        }
                        // 统计后门人数
                        if ("后门".equals(threadName)) {
                            System.out.println("编号为: "+(100-person+1)+" 的员工 从后门 入场!拿到的双色球彩票号码是: "+this.show());
                            backNum++;
                        }
                        person--;
                    }
                    // 1-3:总人数==0,显示前门人数及后门人数
                    if (person == 0) {
                        System.out.println("前门人数:"+frontNum);
                        System.out.println("后门人数:"+backNum);
                        person--;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    // 2、显示双色球结果
    public List<Integer> show() {
        //7  创建集合
        List<Integer> list = new ArrayList<Integer>();
        
        for (int i = 0; i <7; i++) {
            Random r = new Random();
            int num = r.nextInt(33)+1;
            list.add(num);
        }
        return list;
    }

}