多线程练习4 (抢红包)

抢红包也用到了多线程
假设:100块,分成了3个包,现在有5个人去抢其中,红包是共享数据5个人是5条线程。
打印结果如下
XXX抢到了XXX元
XXX抢到了XXX元
XXX抢到了XXX元
XXX没抢到
XXX没抢到

分析 : 三个人抢到了三个红包,那么也就是要求三个人抢到的红包必须得保证都有钱而且红包里面的钱必须随机,如果前两个相加或者其中一个获得100元则都不行,所有可以先保证第二个第三个抢到红包的最少有1元,则第一个最多有98元,所以第一个红包取值范围为1~98之间

int first = r.nextInt(98)+1;

第二个人就是在1~(99-first)之间取

int second = r.nextInt(99-first)+1;

最终结果为

package com.heima.d_text;

import java.util.Arrays;
import java.util.Random;

class Money implements Runnable{
    private int[]arr;
    private static int count =3;
    public Money(int[] arr) {
        this.arr = arr;
    }

    @Override
    public void run() {
        if (count==0){
            System.out.println(Thread.currentThread().getName()+"没抢到");
        }
        while (count > 0){
            synchronized (this){
                if (count > 0){
                    System.out.println(Thread.currentThread().getName()+"抢到了"+arr[count-1]+"元");
                    count--;
                }
            }
            try {
                Thread.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
public class Demo4 {
    public static void main(String[] args) {
        Random r = new Random();
        int first = r.nextInt(98)+1;
        int second = r.nextInt(99 - first)+1;
        int third = 100 - first - second;
        int[]arr = {first,second,third};
        System.out.println(Arrays.toString(arr));

        Money money = new Money(arr);
        new Thread(money,"第一个人").start();
        new Thread(money,"第二个人").start();
        new Thread(money,"第三个人").start();
        new Thread(money,"第四个人").start();
        new Thread(money,"第五个人").start();
    }
}

这里需要注意的是要求第四个和第五个只打印一遍,则需要将第四个和第五个人的放在while循环外面否则第四个第五个会被每个线程都访问一次

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值