java实现自动收红包功能_Java实现抢红包功能
java实战第2版java10开发编程软件
81.4元
包邮
(需用券)
去购买 >
采用多线程模拟多人同时抢红包。服务端将玩家发出的红包保存在一个队列里,然后用Job定时将红包信息推送给玩家。每一批玩家的抢红包请求,其实操作的都是从队列中弹出的第一个红包元素,但当前的红包数量为空的时候,自动弹出下一个红包(如果有的话)。
关键思想:
1.抢红包涉及多人并发操作,需要做好同步保证多线程运行结果正确。
2.由于同时在线人数大,从性能方面考虑,玩家的发红包请求不必及时响应,而由服务端定时执行发红包队列。
下面是主要的代码和实现逻辑说明
1.创建一个类,表示红包这个实体概念。直接采用原子变量保证增减同步。Java的原子变量是一种精度更细的同步机制,在高度竞争的情况下,锁的性能将超过原子变量的性能,但在更真实的竞争情况,原子变量享有更好的性能。
public class SpringGift {
private String role;
private AtomicInteger gift;
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public AtomicInteger getGift() {
return gift;
}
public void setGift(AtomicInteger gift) {
this.gift = gift;
}
public int getRemainCount(){
return this.gift.get();
}
}
2.采用多线程模拟多人同时抢红包。服务端将玩家发出的红包保存在一个队列里,然后用Job定时将红包信息推送给玩家。每一批玩家的抢红包请求,其实操作的都是从队列中弹出的第一个红包元素,但当前的红包数量为空的时候,自动弹出下一个红包(如果有的话)。
public class Test {
public static ConcurrentLinkedQueue queue;
public static SpringGift currGift;
public static AtomicInteger count = new AtomicInteger();
static class myThread implements Runnable{
public void run(){
handleEvent();
}
}
public static void main(String[] args) throws Exception {
queue = new ConcurrentLinkedQueue();
for(int i =0;i<3;i++){
SpringGift gift = new SpringGift();
gift.setRole("role"+i);
gift.setGift(new AtomicInteger(50));
queue.add(gift);
}
myThread mythread = new myThread();
for(int i=0;i<1000;i++){
new Thread(mythread).start();
}
System.err.println("总共收到"+count.get());
}
private static SpringGift getGift(){
//防止多条线程同时弹出队首
synchronized (queue) {//若没有加锁,打印的count总数不对!!!!
if(currGift == null || currGift.getRemainCount() <=0){
currGift = queue.poll();
}
}
return currGift;
}
public static void handleEvent(){
try{
SpringGift obj = getGift();
if(obj == null || obj.getRemainCount() <= 0){
System.err.println("没有了");
return ;
}
if(obj !=null && obj.getGift().getAndDecrement() >0 ){
System.err.println("抢到一个红包");
count.getAndIncrement();
}
Thread.sleep(500);//模拟处理其他操作
}catch(Exception e){
e.printStackTrace();
}
}
}
运行结果部分截图如下
需要注意的是,getGift()这个方法,由于是自动弹出队首元素,必须做好同步机制,否则,当多个请求同时操作某一个红包的最后一次剩余时,会造成总的红包数量不正确。
(将加锁的代码注释后,会发现打印的总数量有可能不正确了!)
原文链接:https://www.cnblogs.com/lgg20/p/12010628.html
java 11官方入门(第8版)教材
79.84元
包邮
(需用券)
去购买 >
java实现自动收红包功能_Java实现抢红包功能相关推荐
- java实现红包要多少钱_Java实现抢红包功能
本文实例为大家分享了Java实现抢红包功能的具体代码,供大家参考,具体内容如下 关键思想: 1.抢红包涉及多人并发操作,需要做好同步保证多线程运行结果正确. 2.由于同时在线人数大,从性能方面考虑,玩 ...
- java实现qq抢红包_Java实现抢红包功能
本文实例为大家分享了Java实现抢红包功能的具体代码,供大家参考,具体内容如下 关键思想: 1.抢红包涉及多人并发操作,需要做好同步保证多线程运行结果正确. 2.由于同时在线人数大,从性能方面考虑,玩 ...
- java具有自动无用内存回收_Java语言程序设计(一)试卷及答案解释
Java语言程序设计(一)试卷及答案解释 本试卷共6页,满分l00分,考试时间l50分钟. 第一部分选择题 一.单项选择题:本大题共l0小题,每小题l分,共10分.在每小题列出的备选项中只有一项是最符 ...
- java:退出功能_Java 8:功能VS传统
java:退出功能 业务逻辑是相同的: 给定一个由访问次数/时间组成的String表达式,例如:" 1 / 24h,1..3 / 3h,5 / *" 然后,结果应为以下字符串列表: ...
- java工程师的终极书单_Java 9 –终极功能列表
java工程师的终极书单 这篇文章将针对即将到来的Java 9版本进行更新,新增功能 ( 最新更新:2014年 9月9日 ) OpenJDK开发正在加快速度:2014年3月Java 8发布后,我们预计 ...
- java 基础包的功能_Java 8的功能基础
java 基础包的功能 Java 8彻底改变了Java. 它很可能是过去10年中最重要的Java版本. 有很多新功能,包括默认方法,方法和构造函数引用以及lambda, 仅举几例 . 更有趣的功能之一 ...
- java抢红包_Java实现抢红包功能
采用多线程模拟多人同时抢红包.服务端将玩家发出的红包保存在一个队列里,然后用Job定时将红包信息推送给玩家.每一批玩家的抢红包请求,其实操作的都是从队列中弹出的第一个红包元素,但当前的红包数量为空的时 ...
- java编写超市收银系统_java编写的超市收银系统
[实例简介] 用java编写的超市收银系统, [实例截图] [核心代码] ad9ea874-4694-4cc4-b634-760c9c1b6b65 └── 超市收银系统 ├── sql │ ├── ...
- java设计按月每天签到_java微信签到功能实现:java做的一个简易的微信签到系统的案例...
java微信签到功能实现,现在微信签到功能很流行,这个签到功能帮助微信用户更好的管理自己的微信公众号,那你想知道java微信签到功能如何实现呢,今天小编就特意为大家分享一个关于java微信签到功能实现 ...
最新文章
- iOS 关于pods-frameworks.sh:permission denied报错的解决
- 【物联网智能网关-14】Html5:Canvas+WebSocket实现远程实时通信(下)
- TSP问题中:如果有n个顶点,那么一共有多少种不同的环游
- Kali Linux安装VMware Tools
- 算法周记(一)直接插入排序
- Mysql创建、删除用户
- go基础语法:数组定义
- jQuery event的复制粘贴的坑
- java GUI怎么输入_在Swing中创建Java GUI以进行表单输入
- C#/.Net操作MongoDBHelper类
- android 动态权限推送图标问题,「JPush」通知栏相关问题
- 多媒体计算机辅助英语教学,多媒体计算机辅助英语教学初探
- 微积分(一)——二重积分与三重积分笔记
- linux操作TF卡的命令
- jQuery stop()用法
- 团队协作工具调研笔记
- 微信小程序和uni-app面试高频知识点
- java计算机毕业设计特色农产品供需销售系统源码+数据库+系统+lw文档+mybatis+运行部署
- 惠普HP Deskjet Ink Advantage 3540 打印机驱动
- BCD码指令 AAA DAA AAS DAS AAM AAD
热门文章
- 【DIY】震精!他居然用esp8266做出掌上游戏机......恐龙跑酷游戏还能这样玩!请广泛转发!...
- 【S操作】我的云存储工具选择,供您参考——总结云存储云办公云笔记工具
- C++之指向对象成员函数的指针
- AWS Elastic Block Store和Simple Storage Services区别
- HttpRunner环境部署-踩坑篇
- we-rich 小程序渲染富文本js库
- 3.C#知识点:is和as
- 基于element-ui实现table可配置化
- 实现SQL Server 2012 镜像
- 微软企业库5.0学习笔记(四)配置企业库