java多线程案列

本文介绍了一个使用Java实现的多线程抽奖程序,通过创建抽奖池数组并将元素放入集合中,利用线程间的同步机制确保奖项不重复,展示了如何在多线程环境下进行资源的公平分配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


import java.util.*;

/*
* 有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池中的奖项为 {10,5,20,50,100,200,500,800,2,80,300,700};
创建两个抽奖箱(线程)设置线程名称分别为“抽奖箱1”,“抽奖箱2”,随机从抽奖池中获取奖项元素并打印在控制台上,格式如下:
每次抽出一个奖项就打印一个(随机但是奖励不能重复)
1.每次抽出一个奖项就打印一个(随机)
 抽奖箱1 又产生了一个 10 元大奖
 抽奖箱1 又产生了一个 100 元大奖
 抽奖箱1 又产生了一个 200 元大奖
 抽奖箱1 又产生了一个 800 元大奖
 抽奖箱2 又产生了一个 700 元大奖
 //.....
* */
public class Test1 {



    public static void main(String[] args) {
        //创建一个抽奖池数组
        int[] arr = {10, 5, 20, 50, 100, 200, 500, 800, 2, 80, 300, 700};
        //将抽奖池中的元素放入集合list中(因为集合可以有删除方法,便于操作)
        ArrayList<Integer> list = new ArrayList<>();
        for (int i : arr) {
            list.add(i);
        }

        //创建Random对象模拟抽奖
        Random r = new Random();

        //创建Runnable接口的匿名内部类 重写run方法 run方法中就是线程任务
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                while (true){
                    synchronized (this){
                        if(list.size()>0){
                            //随机抽取一个奖项的索引值
                            int index = r.nextInt(list.size());
                            //list调用remove方法 返回被删除的对象
                            Integer beRemove = list.remove(index);
                            //让该线程睡一会 给另一个线程一点抢夺的机会
                            try {
                                Thread.sleep(300);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            //打印抽到的奖项
                            System.out.println(Thread.currentThread().getName()+" 又产生了一个 "+beRemove+" 元大奖");
                        }else{
                            break;
                        }
                    }


                }
            }
        };

        //创建两个线程模拟抽奖箱,并将Runnable对象传递过来
        Thread t1 = new Thread(runnable, "抽奖箱1");
        Thread t2 = new Thread(runnable, "抽奖箱2");

        //调用线程的start方法 开启线程
        t1.start();
        t2.start();





    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值