有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池中的奖项为 {10,5,20,50,100,200,500,800,2,80,300,700}; 随机从抽奖池中获取奖项元素并打印在控制台上

有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池中的奖项为 {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();
    }

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值