并发编程学习案例-模拟抢红包
创始人
2024-05-09 06:31:03
0

一、前言

再来系统动手学习一下Java并发编程。
知识点:CountDownLatch 的发令枪使用模式;红包均分,最后一个分不完的解决方法
抢红包的需求,每个红包均分,最后一个除外
1. 设置红包总额
2. 设置红包的个数
3. 模拟抢红包的人数 (细节:涉及余额分配 10元3个人抢,得把钱分完)
4. 抢红包,同一时间多个人可以同时开始 (细节:要保证同时开始)

二、代码案例

package com.lvzb.concurrent;import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;import java.util.Scanner;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;/*** 抢红包案例** @author: lvzb31988* @date: 2023/01/09 20:00*/
@Slf4j
public class GrabRedEnvelopeTest {public static void main(String[] args) throws InterruptedException {int totalAmount;int num;int peopleNum;CountDownLatch countDownLatch = new CountDownLatch(1);Scanner scanner = new Scanner(System.in);System.out.println("请输入红包金额:");totalAmount = scanner.nextInt();System.out.println("请输入拆分多少个红包:");num = scanner.nextInt();System.out.println("请输入多少个人抢:");peopleNum = scanner.nextInt();RedEnvelope redEnvelope = new RedEnvelope(totalAmount, num, countDownLatch);//        for (int i = 1; i <= peopleNum; i++) {
//            new Thread(redEnvelope, "第" + i + "个人").start();
//        }
//        countDownLatch.countDown();ExecutorService pool = Executors.newFixedThreadPool(peopleNum);for (int i = 1; i <= peopleNum; i++) {pool.execute(redEnvelope);}countDownLatch.countDown();// 不关闭池的话,程序不会结束pool.shutdown();}/*** 抢红包的需求,每个红包均分,最后一个除外* 1. 设置红包总额* 2. 设置红包的个数* 3. 模拟抢红包的人数 (细节:涉及余额分配 10元3个人抢,得把钱分完)* 4. 抢红包,同一时间多个人可以同时开始 (细节:要保证同时开始)*/public static class RedEnvelope implements Runnable {/*** 红包总额*/private int totalAmount;/*** 红包个数*/private int num;/*** 每个红包均分的 额度*/private int eachAmount;/*** 特殊处理最后一个红包的额度,防止分不完*/private int lastAmount;// countDownLatch 的发令枪模式private CountDownLatch countDownLatch;// 保证线程安全private Object lock = new Object();public RedEnvelope(int totalAmount, int num, CountDownLatch countDownLatch) {this.totalAmount = totalAmount;this.num = num;this.countDownLatch = countDownLatch;this.eachAmount = totalAmount / num;// 最后一个红包金额 =  总额 - (红包总数-1)* 每个红包的数this.lastAmount = totalAmount - (num - 1) * eachAmount;}@Overridepublic void run() {synchronized (lock) {try {countDownLatch.await();} catch (InterruptedException e) {// 如果当前线程异常,就可以通知线程应该中断了Thread.currentThread().interrupt();e.printStackTrace();}int currentAmount;if (num != 1) {currentAmount = eachAmount;} else {currentAmount = lastAmount;}if (num > 0) {num--;System.out.println(Thread.currentThread().getName() + ": hhhh 我抢到了" + currentAmount + "元...");} else {System.out.println(Thread.currentThread().getName() + ": 没有抢到,错过一个亿...");}}}}
}

输出结果参考

在这里插入图片描述
在这里插入图片描述

参考资料

  • Java 最新版并发编程入门与春晚抢红包实战
  • CountDownLatch的使用场景

相关内容

热门资讯

国家电网重庆市电力公司原党委书...   据中央纪委国家监委驻国家电网有限公司纪检监察组、湖北省纪委监委消息:国家电网重庆市电力公司原党委...
潜心补短板 着力优结构——开年...   新华社北京1月18日电 题:潜心补短板 着力优结构——开年以来各地各部门稳投资观察  新华社记者...
【理响中国】更加清醒坚定地推进...   腐败是党和国家事业发展进程中的拦路虎、绊脚石,反腐败是一场输不起也决不能输的重大斗争。在二十届中...
“春风行动”让家门直通厂门、五...   央视网消息:眼下正是宁夏的冬闲时节,而春节前后则是沿海地区用工缺口的高峰期。16日,宁夏“202...
“十五五”开好局起好步|从“会...   央视网消息:从写入“十五五”规划建议到走进现实的智能载体,“具身智能”的发展速度超出想象,而人形...
焦点访谈|海南自贸港全岛封关“...   央视网消息(焦点访谈):2025年12月18日,海南自由贸易港正式启动全岛封关,标志着3万多平方...
晶采观察丨八部门发文!银发福利...   赶紧转给爸妈,2026年养老消费有了更多新选择。近日,民政部等八部门联合印发《关于培育养老服务经...
视频丨为夺格陵兰岛 美再挥关税...   17日,丹麦本土和格陵兰岛多地分别举行游行示威,抗议美国近期持续发表觊觎格陵兰岛的言论。然而就在...
哥伦比亚发生武装冲突 已致20...   当地时间16日,哥伦比亚中南部的瓜维亚雷省埃尔雷东托市农村地区发生一起严重武装冲突,造成至少20...