Java实现抢红包

效果:

在这里插入图片描述

代码:

public class TestDemo {

    public static void main(String[] args) {
        MyRunnable.setRedPackage(100, 3);

        System.out.println("红包总额 " + MyRunnable.originRedPackage.remainMoney + " 红包总个数 " + MyRunnable.originRedPackage.remainSize);

        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        Thread thread1 = new Thread(myRunnable);
        Thread thread2 = new Thread(myRunnable);
        Thread thread3 = new Thread(myRunnable);
        thread.start();
        thread1.start();
        thread2.start();
        thread3.start();
    }
}
import java.math.BigDecimal;

public class MyRunnable implements Runnable {

    public static RedPackage originRedPackage = new RedPackage();


    static class RedPackage {
        int    remainSize;
        BigDecimal remainMoney;
    }

    public static void setRedPackage(int totalMoney, int totalSize) {
        originRedPackage.remainMoney = BigDecimal.valueOf(totalMoney);
        originRedPackage.remainSize = totalSize;
    }

    public static synchronized BigDecimal getRandomMoney(boolean isRound, int scale) {

        // isRound红包金额是否整数
        // scale红包金额保留几位小数
        // remainSize 剩余的红包数量
        // remainMoney 剩余的钱
        if (originRedPackage.remainSize == 0) {
            return new BigDecimal(0);
        }

        if (originRedPackage.remainSize == 1) {
            originRedPackage.remainSize--;
            if (isRound) {
                return originRedPackage.remainMoney.setScale(0, BigDecimal.ROUND_DOWN);
            } else {
                return originRedPackage.remainMoney.setScale(scale, BigDecimal.ROUND_DOWN);
            }
        }

        BigDecimal random = BigDecimal.valueOf(Math.random());
        double minTemp;
        if (isRound) {
            minTemp = 0;
        } else {
            minTemp = 0.01;
        }
        BigDecimal min   = BigDecimal.valueOf(minTemp);

        BigDecimal halfRemainSize = BigDecimal.valueOf(originRedPackage.remainSize).divide(new BigDecimal(2), BigDecimal.ROUND_UP);
        BigDecimal max1 = originRedPackage.remainMoney.divide(halfRemainSize, BigDecimal.ROUND_DOWN);
        BigDecimal minRemainAmount = min.multiply(BigDecimal.valueOf(originRedPackage.remainSize - 1)).setScale(scale, BigDecimal.ROUND_DOWN);
        BigDecimal max2 = originRedPackage.remainMoney.subtract(minRemainAmount);
        BigDecimal max = (max1.compareTo(max2) < 0) ? max1 : max2;

        BigDecimal money = random.multiply(max).setScale(scale, BigDecimal.ROUND_DOWN);
        money = money.compareTo(min) < 0 ? min: money;

        originRedPackage.remainSize--;
        originRedPackage.remainMoney = originRedPackage.remainMoney.subtract(money).setScale(scale, BigDecimal.ROUND_DOWN);;
        return money;
    }

    @Override
    public void run() {
        System.out.println("线程 " + Thread.currentThread().getId() + " 抢到了 " + getRandomMoney(false, 1) + " 元红包");
        try {
            Thread.sleep(20);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值