本文实例为大家分享了Java实现抢红包功能的具体代码,供大家参考,具体内容如下

关键思想:

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()这个方法,由于是自动弹出队首元素,必须做好同步机制,否则,当多个请求同时操作某一个红包的最后一次剩余时,会造成总的红包数量不正确。

(将加锁的代码注释后,会发现打印的总数量有可能不正确了!)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java实现qq抢红包_Java实现抢红包功能相关推荐

  1. java仿qq思路_java仿QQ聊天软件OIM艰辛之路(开源项目)

    既然QQ能仿ICQ, 咱java也来个仿QQ. 在我刚学完java后,就想做点什么项目锻炼下自己的技能.凑巧的是,我一个同样学java的朋友在做一个仿qq的项目,不过他做的实在太丑了. 然后他想让我也 ...

  2. java读取qq邮箱_java获取qq邮箱中的好友列表

    评论 # re: java获取qq邮箱中的好友列表 2009-05-07 20:56 咖啡@可乐 # re: java获取qq邮箱中的好友列表 2009-05-08 09:07 EverestSnow ...

  3. java实现qq抢红包_Java实现抢红包功用

    用多线程模仿多人一起抢红包.服务端将玩家发出的红包保存在一个行列里,然后用Job守时将红包信息推送给玩家.每一批玩家的抢红包恳求,其实操作的都是从行列中弹出的第一个红包元素,但当时的红包数量为空的时分 ...

  4. java抢红包_Java实现抢红包功能

    采用多线程模拟多人同时抢红包.服务端将玩家发出的红包保存在一个队列里,然后用Job定时将红包信息推送给玩家.每一批玩家的抢红包请求,其实操作的都是从队列中弹出的第一个红包元素,但当前的红包数量为空的时 ...

  5. java基础多线程抢红包_Java实现抢红包功能

    采用多线程模拟多人同时抢红包.服务端将玩家发出的红包保存在一个队列里,然后用Job定时将红包信息推送给玩家.每一批玩家的抢红包请求,其实操作的都是从队列中弹出的第一个红包元素,但当前的红包数量为空的时 ...

  6. java实现qq抢红包_Java实现抢红包算法,附完整代码(公平版和手速版)

    当我们在群里抢红包时真的是手速越快红包金额越大吗? 当我们在群里抢红包时真的是手速越快红包金额越大吗? 答案当然是并不是,都说了是拼手气,岂能是拼手速! 不过也可以有拼手速的方法 二倍均值法(公平版) ...

  7. java发送qq消息_Java点餐系统和点餐小程序新加微信消息推送功能

    其实想给点餐系统加推送很久了,之前也有单门写过Java版的微信消息推送和云开发版的微信消息推送.之所以一直没有加,也是考虑到大家的学习接受度,因为做订阅消息推送是一个综合性的开发工作. 需要你既要会小 ...

  8. java 实现秒抢_Java实现抢红包算法,附完整代码(公平版和手速版)

    当我们在群里抢红包时真的是手速越快红包金额越大吗? 当我们在群里抢红包时真的是手速越快红包金额越大吗? 答案当然是并不是,都说了是拼手气,岂能是拼手速! 不过也可以有拼手速的方法 二倍均值法(公平版) ...

  9. java生成验证码实例_Java生成验证码功能实例代码

    页面上输入验证码是比较常见的一个功能,实现起来也很简单.给大家写一个简单的生成验证码的示例程序,需要的朋友可以借鉴一下. 闲话少续,直接上代码.代码中的注释很详细. package com.SM_te ...

最新文章

  1. 【数据库】SQLite和MySQL之间的对比和选择
  2. 17-flutter导航栏渐变效果
  3. Jetson TX2刷机
  4. Caffe —— Deep learning in Practice 深度学习实践
  5. 强化学习6——policy gradient的变种State of the Art
  6. C#网络类智能开关控制板实例
  7. Java-值传递和引用传递
  8. 石头剪子布蜥蜴史波克python_C++字符串——石头剪刀布
  9. 2021跨境电商独立站将喷发式增长?你知道怎样运营独立站吗?
  10. 一将无能,累死三军!数据团队有“会说话”的好领导,有多重要?
  11. edittext在哪可以获取有效值_java-从EditText获取文本字符串?
  12. python编辑器是什么_python开发用什么编辑器
  13. Qt总结二十一:Qt控件一(QWidget)
  14. 由耶稣遗物看西方历史的造假
  15. 【AI视野·今日CV 计算机视觉论文速览 第186期】Fri, 6 Nov 2020
  16. JWT全面解读、使用步骤
  17. c语言pow的作用,c语言中pow函数的用法是什么?
  18. java 拉姆达表达式_Java8中foreach与拉姆达表达式的组合使用
  19. 练字格子纸模板pdf_十字田字格模板空格40格-练字用书十字格a4打印版下载最新excel版-西西软件下载...
  20. Gephi 网络可视化——调整节点大小

热门文章

  1. 合同在线修改 java_Java并发编程实战-第四章
  2. 基于jsp+ssm的驾校预约管理系统
  3. oracle 延迟加载,延迟约束禁止直接路径插入
  4. 搭建Linux开发环境遇到的问题
  5. Python开发微信公众号后台(系列三)
  6. Ubuntu 11.10 图形(图解)安装教程、基本设置、网络设置、软件源、硬件驱
  7. 7.Bean的自动装配
  8. Gartner发布《2022年12大技术趋势》:超自动化连续3年入选
  9. Unity - 粒子系统跟随路径移动
  10. 从0到1,我们一起调试温控仪表