• 抢红包是在并发场景下操纵和获取资源,只需要将操作和获取的过程建立线程安全机制即可;
  • 抢红包需要多线程同时访问同一共享资源,所以将共享资源作为成员变量注入线程类中供其调用 (使用操纵内存的方式);

实现过程

红包类:

// 红包实体,共享变量,通过直接操作内存实现
public class RedPack{// 红包剩余数量int remain;// 总金额double total;public RedPack (int remain, double total) {this.remain = remain;// 保留两位小数this.total = new BigDecimal(total).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();}// 抢红包的动作,加上了synchronized进行并发控制synchronized public double grab() {// 抢到的结果返回给线程展示double result;// 场景 1:还剩最后一个红包,直接拿走if (remain == 1) {result = new BigDecimal(total).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();total = 0;remain--;// 场景 2:超过一个红包,生成一个(0, total)之间的随机金额} else if (remain > 1) {result = new BigDecimal((Math.random()*total)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();total -= result;remain--;// 场景 3:红包被抢完了} else {result = 0;}return result;}
}

线程:用户类

public class User implements Runnable{// 用户编号,区分线程int num;// 引入共享变量RedPack rp;// 抢到的金额double money;public User (int num, RedPack rp) {this.num = num;this.rp = rp;}@Overridepublic void run() {System.out.println("用户" + num + "尝试抢红包");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}// 抢红包money = rp.grab();if (money > 0) {System.out.println("用户" + num + "抢到" + money + "元");} else {System.out.println("用户" + num + "未能抢到红包");}}
}

主类:

public class Main {// 抢红包用户数static final int user = 5;// 红包个数static final int remain = 4;// 总金额static final double total = 10;public static void main(String[] args) {RedPack rp = new RedPack(remain, total);System.out.println("抢红包开始,当前红包剩余" + total + "元");// 启动用户数量的线程for (int k = 1; k <= user; k++) {new Thread(new User(k, rp)).start();}}
}

运行结果:

 抢红包开始,当前红包剩余10.0元用户1尝试抢红包用户3尝试抢红包用户2尝试抢红包用户5尝试抢红包用户4尝试抢红包用户3未能抢到红包用户1抢到0.52元用户4抢到6.99元用户2抢到0.5元用户5抢到1.99元

Java多线程实现简单抢红包相关推荐

  1. Java多线程实现简单动画(小球运动)效果

    目录 目录 1.多线程的两种实现方式 1.0.关于多线程理解 1.1.Runnable 1.2.Thread 2.实现动画效果的两种方式 2.0.实现过程理解 2.1.画板(JPanel)线程 2.2 ...

  2. java点名代码滚动_JAVA多线程实现简单的点名系统

    效果图如下: CMain函数: package com.shubing.main; public class CMain { public static void main(String[] args ...

  3. Java多线程中使用ReentrantLock、synchronized加锁 简单举例

    Java多线程中使用ReentrantLock.synchronized加锁 简单举例 public class Demo {final static Lock lock = new Reentran ...

  4. java多线程教程_java 基础教程之多线程详解及简单实例

    java 多线程详解 在这篇文章里,我们关注多线程.多线程是一个复杂的话题,包含了很多内容,这篇文章主要关注线程的基本属性.如何创建线程.线程的状态切换以及线程通信. 线程是操作系统运行的基本单位,它 ...

  5. java实现红包要多少钱_JAVA实现简单抢红包算法(模拟真实抢红包)

    闲来无事,最近项目需求要写出用户登录首页来发现金红包,没有限额.我就自己稍微计算了一下如果有限额该怎么写.觉得这样与微信红包差不多.等项目需求完成以后.正好来博客贴一下我自己写的拆红包算法.个人觉得这 ...

  6. java 线程死锁简单例子_java 多线程死锁详解及简单实例

    java 多线程死锁 相信有过多线程编程经验的朋友,都吃过死锁的苦.除非你不使用多线程,否则死锁的可能性会一直存在.为什么会出现死锁呢?我想原因主要有下面几个方面: (1)个人使用锁的经验差异 (2) ...

  7. 40个Java多线程问题总结

    (转) 这篇文章作者写的真是不错 40个问题汇总 1.多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡.所谓"知其然知其所 ...

  8. Java多线程学习处理高并发问题

    在程序的应用程序中,用户或请求的数量达到一定数量,并且无法避免并发请求.由于对接口的每次调用都必须在返回时终止,因此,如果接口的业务相对复杂,则可能会有多个用户.调用接口时,该用户将冻结. 以下内容将 ...

  9. Java多线程常见面试题及答案汇总1000道(春招+秋招+社招)

    Java多线程面试题以及答案整理[最新版]Java多线程高级面试题大全(2021版),发现网上很多Java多线程面试题都没有答案,所以花了很长时间搜集,本套Java多线程面试题大全,汇总了大量经典的J ...

最新文章

  1. HSC86H SUMTOR 混合步进伺服电机驱动器
  2. KS012基于SSM实现个人记账管理系统
  3. java如何获得点的横纵坐标_横纵坐标怎么区分
  4. libevent多线程使用bufferevent的那些事
  5. 干货 | 携程异地多活-MySQL实时双向(多向)复制实践
  6. 阿里云自研新一代企业云数据库POLARDB背后的技术
  7. 如何对CAD进行区域覆盖
  8. 蔚来辅助驾驶致死,副总裁沈斐或遇更大危机
  9. JS备忘--子父页面获取元素属性、显示时间,iframe之间互相调用函数
  10. sqlserver 导出数据库表结构和数据生成脚本
  11. 判断非负整数是否是3的倍数_价格是最小变动价位(tick)整数倍检查
  12. HNU 12814 SIRO Challenge(最短路+状态压缩+dp)
  13. Kafka有多个broker的例子——重点是Replicas和lsr和Leader位置
  14. java long 运算_Java Long类型,阶乘计算
  15. 2022软件工程师薪资报告出炉!
  16. JAVA之Swing组件(常用)
  17. appbarlayout-spring-behavior
  18. [C# 网络编程系列]专题五:TCP编程
  19. android framelayout view上下层_理解并测试什么是Android事件分发
  20. 业余无线电通信_其它业余无线电通信方式应避免占用业余卫星频率

热门文章

  1. 求N个数的最大公约数和最小公倍数
  2. 语音交友app开发权限系统,全面的设计方案
  3. Redis使用cmd命令清理缓存
  4. python爬取抖音APP视频教程
  5. 打印页面时候的物理px,即windh跟height分别设为多少打印出来的合适
  6. 基于FPGA+MPU+MCU全自动血细胞分析仪解决方案
  7. 腾讯云动态公网IP绑定域名实现内网服务器公网穿透
  8. 租用云服务器贵吗,如何对比选购
  9. uniapp 开发移动端对接巴法云物联网平台控制ESP8266开关灯
  10. linux射击游戏下载,子弹骑士地牢爬行射击