有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池中的奖项为 {10,5,20,50,100,200,500,800,2,80,300,700};
随机从抽奖池中获取奖项元素并打印在控制台上,格式如下:
每次抽出一个奖项就打印一个
XXX又产生了一个 100 元大奖
XXX又产生了一个 500 元大奖
XXX又产生了一个 200 元大奖
XXX又产生了一个 80 元大奖
XXX又产生了一个 2 元大奖
XXX又产生了一个 10 元大奖
XXX又产生了一个 5 元大奖
XXX又产生了一个 700 元大奖
XXX又产生了一个 20 元大奖
XXX又产生了一个 300 元大奖
XXX又产生了一个 800 元大奖
XXX又产生了一个 50 元大奖
XXX共抽取了8次
XXX共抽取了4次
要求:
1,每次抽取到的奖金是不能重复的
2,两条线程抽取奖的有效次数刚好为12次
3,最后统计每条线程分别抽取了多少次
XXX为线程名字
public class MyRunnable implements Runnable{
//定义锁的对象
private Lock lock = new ReentrantLock();
//创建一个数组
private int[] arr = {10,5,20,50,100,200,500,800,2,80,300,700};
private ArrayList<Integer> list = new ArrayList<>();
private Random r = new Random();
@Override
public void run() {
//计数器
int count = 0;
while (true){
try {
lock.lock();
//获取线程名
String name = Thread.currentThread().getName();
if (name.equals("pool-1-thread-1")){
name = "抽奖箱1";
}else {
name = "抽奖箱2";
}
//如果集合跟数组长度一样长难么就结束循环
if (list.size() == arr.length){
System.out.println(name +" 一共抽取到了 "+count+" 个有效奖金");
break;
}
//使用随机数产生一个随机索引,长度为数组的长度
int nextInt = r.nextInt(arr.length);
//判断如果集合里面不包含这个随机数组那么就打印。添加集合
if (!list.contains(arr[nextInt])){
System.out.println(name+"又抽到了一次"+arr[nextInt]+"奖金");
list.add(arr[nextInt]);
//ist.clear();
count++;
}
} finally {
lock.unlock();
}
}
}
}
测试类
public static void main(String[] args) {
//创建线程池
ThreadPoolExecutor pool = new ThreadPoolExecutor(
2,//核心线程数
5,//临时线程
10,//临时线程空闲存活时间
TimeUnit.SECONDS,//临时线程时间单位、秒
new ArrayBlockingQueue<>(10),//阻塞队列
Executors.defaultThreadFactory(),//线程创建方式,采用默认
new ThreadPoolExecutor.AbortPolicy()//任务拒绝策略
);
MyRunnable mb1 = new MyRunnable();
//创建两条线程
pool.submit(mb1);
pool.submit(mb1);
//销毁线程池
pool.shutdown();
}