欢迎使用CSDN-markdown编辑器

来源:互联网 发布:长春知远画室在哪 编辑:程序博客网 时间:2024/06/03 14:58

小案例——公司年会双色球抽奖

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

public static void main(String[] args){        //用来装红色球        List<Integer> redList=new ArrayList<Integer>();        //用来装蓝色球        List<Integer> blueList=new ArrayList<Integer>();        //33个红色球        for (int i = 1; i <=33; i++) {            redList.add(i);        }        //16个蓝色球        for (int i = 1; i <=16; i++) {            blueList.add(i);        }        DoorThread frontDoor=new DoorThread("前门",redList, blueList);        DoorThread backDoor=new DoorThread("后门",redList, blueList);        frontDoor.start();        backDoor.start();}

DoorThread.java:

public class DoorThread extends Thread{    private List<Integer> redList;    private List<Integer> blueList;    private List<Integer> list=new ArrayList<Integer>();    Random r=new Random();    Lock lock=new ReentrantLock();    private static Integer number=0;    private int count=0;    public DoorThread(String name,List<Integer> redList, List<Integer> blueList) {        super(name);        this.redList = redList;        this.blueList = blueList;    }    //编号为: 2 的员工 从后门 入场! 拿到的双色球彩票号码是: [17, 24, 29, 30, 31, 32, 07]    public void run(){        while (true) {            //synchronized (this) {                lock.lock();                //取红色球                Collections.shuffle(redList);                lock.unlock();                //lock.lock();                for (int i = 0; i < 5; i++) {                    list.add(redList.get(i));                }                //lock.unlock();                Collections.sort(list);                //lock.unlock();                lock.lock();                //取蓝色球                list.add(blueList.get(r.nextInt(16)));                if (number<100) {                    synchronized (number) {                        count++;                        System.out.println("编号为: "+(++number) +" 的员工从 "+Thread.currentThread().getName()+" 入场!"                                +"拿到的双色球号码是: "+list);                        list.clear();                    }                }else {                    System.out.println("一共有:"+count+" 人从 "+Thread.currentThread().getName()+" 入场!");                    break;                }                lock.unlock();            //}         }    }}
原创粉丝点击