5、抽奖池抽奖线程管理实现

编程题目:

5.有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池用一个数组:

int[] arr = {10,5,20,50,100,200,500,800,2,80,300};

创建两个抽奖箱(线程)设置线程名称分别为“抽奖箱1”,“抽奖箱2”,随机从arr数组中获取奖项元素并打印在控制台上,格式如下:

抽奖箱1 又产生了一个 10 元大奖!

抽奖箱2 又产生了一个 100 元大奖!

…..

要求:奖金不可出现重复的,被抽走了就不能再出现了。

示例代码:

package program.thread.exercise05;

import java.util.*;

/**
 * 5. 有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池用一个数组int[] arr = {10,5,20,50,100,200,500,800,2,80,300}; 
 * 创建两个抽奖箱(线程)设置线程名称分别为“抽奖箱1”,“抽奖箱2”,随机从arr数组中获取奖项元素并打印在控制台上,格式如下:
 * 抽奖箱1 又产生了一个 10 元大奖
 * 抽奖箱2 又产生了一个 100 元大奖    
 * .....
 * 要求:奖金不可出现重复的,被抽走了就不能再出现了
**/

public class RewardPool {
    public static void main(String[] args) {

        Reward reward = new Reward(); //创建奖金实例对象

        new Thread(reward,"抽奖箱1").start(); //启动线程
        new Thread(reward,"抽奖箱2").start();

    }
}

//创建奖金类
class Reward implements Runnable {

    int[] arr = {10,5,20,50,100,200,500,800,2,80,300};//抽奖数额数组
    List<Integer> list = new ArrayList<Integer>();//用于存放随机产生的数组下标

    @Override
    public void run() {
        while(true){
            synchronized (this) {
                int index = (int) (Math.random()*arr.length);//随机获取数组下标
                if(list.size() == arr.length){ //当集合长度等于数组长度,表明奖已经抽完
                    return;
                }
                if(!list.contains(index)){ //如果集合不包括随机产生的下标,则添加下标
                    list.add(index);

                    try {
                        Thread.sleep(30);
                        String name = Thread.currentThread().getName();
                        if(name.equals("抽奖箱1")){
                            System.out.println(name+"又产生了一个 "+arr[index]+"元大奖");
                        }
                        if(name.equals("抽奖箱2")){
                            System.out.println(name+"又产生了一个 "+arr[index]+"元大奖");
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

结果显示:

这里写图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章