题目:抽奖池抽奖
一、题目描述:
有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池用一个数组 int [] arr = {10,5,20,50,100,200,500,800,2,80,300};创建两个抽奖箱(线程)设置线程名称分别为“抽奖箱 1”,“抽奖箱 2”,随机从 arr 数组中获取奖项元素并打印在控制台上,但是最终相同金额不能抽取多次。
注意:随机数获取使用 Math.random() 可以得到一个 [0,1) 的随机小数。返回格式如下:
抽奖箱1 又产生了一个 10 元大奖
抽奖箱2 又产生了一个 50 元大奖
二、核心代码如下:
package homework10.homework1025;
/**
* 有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池用一个数组 int [] arr = {10,5,20,50,100,200,500,800,2,80,300};
* 创建两个抽奖箱(线程)设置线程名称分别为“抽奖箱 1”,“抽奖箱 2”,随机从 arr 数组中获取奖项元素并打印在控制台上,但是最终相同金额不能抽取多次。
* 注意:随机数获取使用 Math.random() 可以得到一个 [0,1) 的随机小数。返回格式如下:
* 抽奖箱1 又产生了一个 10 元大奖
* 抽奖箱2 又产生了一个 50 元大奖
*/
public class Demo01 {
public static void main(String[] args) {
lotteryPool lottery = new lotteryPool();//实例化对象
Thread t1 = new Thread(lottery,"抽奖箱1");
Thread t2 = new Thread(lottery,"抽奖箱2");
t1.start();//启动线程
t2.start();//启动线程
}
}
class lotteryPool extends Thread{
int [] arr = {10,5,20,50,100,200,500,800,2,80,300};
boolean[] flag = new boolean[arr.length];//创建一个Boolean型数组
int length = 0;
public void run(){
while(length<arr.length){//当下标达到Boolean型数组的arr.length-1时,数据已取完,跳出循环
try {
Thread.sleep(1000);//每次线程休眠一秒再执行
} catch (InterruptedException e) {
e.printStackTrace();
}
int index = (int) (Math.random() * arr.length);//获取随机Boolean型数组的下标并获取相同位置上的arr数组的值
synchronized (this){
if(!flag[index]){
System.out.println(Thread.currentThread().getName()+"又产生了一个"+arr[index]+"元大奖");
flag[index]=true;//Boolean数组已经取过值的位置赋值为true
length++;//每取出一个值长度加一,当下标值达到Boolean型数组的长度减一时,证明已经取完。
}
}
}
}
}