java实现多线程案例实现一

实现案例

有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池用一个数组int[] arr = {10,5,20,50,100,200,500,800,2,80,300};
创建两个抽奖箱(线程)设置线程名称分别为“抽奖箱1”,“抽奖箱2”,随机从arr数组中获取奖项元素并打印在控制台上,格式如下:

抽奖箱1 又产生了一个 10 元大奖
抽奖箱2 又产生了一个 100 元大奖	
//.....

案例分析:

1.首先创建一个资源类 存储数组和一个布尔值(用来实现轮流打印输出结果)

class Resource2 {
    public  int[] arr = {10,5,20,50,100,200,500,800,2,80,300};
    public boolean flag = true;
}

注意:
这里将flag设置成true的意思是 当flag为true,就执行第一个线程,打印抽奖箱1 又产生了…(当然也可以设置成false 原理一样)
2.创建两个线程类,实现多线程

class Thread1 implements Runnable{
    private Resource2 r;
    public Thread1(Resource2 r){
        this.r = r;
    }
    @Override
    public void run() {
        while (true){
            synchronized (r){
                if(r.flag==false){
                    try{r.wait();}catch (Exception ex){};
                }
                Random ran = new Random();
                int i = ran.nextInt(r.arr.length);
                System.out.println(Thread.currentThread().getName()+"又产生了"+r.arr[i]+"元大奖");
                r.flag=false;
                r.notify();
            }
        }
    }
}
class Thread2 implements Runnable{
    private Resource2 r;
    public Thread2(Resource2 r){
        this.r = r;
    }

    @Override
    public void run() {
        while (true){
            synchronized (r){
                if(r.flag==true){
                    try{r.wait();}catch (Exception ex){};
                }
                Random ran = new Random();
                int i = ran.nextInt(r.arr.length);
                System.out.println(Thread.currentThread().getName()+"又产生了"+r.arr[i]+"元大奖");
                r.flag=true;
                r.notify();
            }
        }
    }
}

注意:
这里要想实现数组内值的随机打印,需要先获取数组的长度,然后通过int i = new random().nextInt(arr.length) 随机获取一个数组的下标,然后通过arr[i]获取数组内的值来实现随机打印。(代码可以再次进行提取)
3.调用main方法测试程序是否满足要求

public class Test7 {
    public static void main(String[] args) {
//        int[] arr = {10,5,20,50,100,200,500,800,2,80,300};
        Resource2 r = new Resource2();
        Thread1 thread1 = new Thread1(r);
        Thread t0 = new Thread(thread1);
        t0.setName("抽奖池1");
        t0.start();

        Thread2 thread2 = new Thread2(r);
        Thread t1 = new Thread(thread2);
        t1.setName("抽奖池2");
        t1.start();

    }

}

在这里插入图片描述
总结:
要想实现多线程的轮流打印(实现线程之间的通信),就是运用了等待与唤醒机制中的wait()和notify()方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千鹤249i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值