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实现抢红包功能相关推荐

  1. java实现红包要多少钱_Java实现抢红包功能

    本文实例为大家分享了Java实现抢红包功能的具体代码,供大家参考,具体内容如下 关键思想: 1.抢红包涉及多人并发操作,需要做好同步保证多线程运行结果正确. 2.由于同时在线人数大,从性能方面考虑,玩 ...

  2. java实现qq抢红包_Java实现抢红包功能

    本文实例为大家分享了Java实现抢红包功能的具体代码,供大家参考,具体内容如下 关键思想: 1.抢红包涉及多人并发操作,需要做好同步保证多线程运行结果正确. 2.由于同时在线人数大,从性能方面考虑,玩 ...

  3. java具有自动无用内存回收_Java语言程序设计(一)试卷及答案解释

    Java语言程序设计(一)试卷及答案解释 本试卷共6页,满分l00分,考试时间l50分钟. 第一部分选择题 一.单项选择题:本大题共l0小题,每小题l分,共10分.在每小题列出的备选项中只有一项是最符 ...

  4. java:退出功能_Java 8:功能VS传统

    java:退出功能 业务逻辑是相同的: 给定一个由访问次数/时间组成的String表达式,例如:" 1 / 24h,1..3 / 3h,5 / *" 然后,结果应为以下字符串列表: ...

  5. java工程师的终极书单_Java 9 –终极功能列表

    java工程师的终极书单 这篇文章将针对即将到来的Java 9版本进行更新,新增功能 ( 最新更新:2014年 9月9日 ) OpenJDK开发正在加快速度:2014年3月Java 8发布后,我们预计 ...

  6. java 基础包的功能_Java 8的功能基础

    java 基础包的功能 Java 8彻底改变了Java. 它很可能是过去10年中最重要的Java版本. 有很多新功能,包括默认方法,方法和构造函数引用以及lambda, 仅举几例 . 更有趣的功能之一 ...

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

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

  8. java编写超市收银系统_java编写的超市收银系统

    [实例简介] 用java编写的超市收银系统, [实例截图] [核心代码] ad9ea874-4694-4cc4-b634-760c9c1b6b65 └── 超市收银系统 ├── sql │   ├── ...

  9. java设计按月每天签到_java微信签到功能实现:java做的一个简易的微信签到系统的案例...

    java微信签到功能实现,现在微信签到功能很流行,这个签到功能帮助微信用户更好的管理自己的微信公众号,那你想知道java微信签到功能如何实现呢,今天小编就特意为大家分享一个关于java微信签到功能实现 ...

最新文章

  1. iOS 关于pods-frameworks.sh:permission denied报错的解决
  2. 【物联网智能网关-14】Html5:Canvas+WebSocket实现远程实时通信(下)
  3. TSP问题中:如果有n个顶点,那么一共有多少种不同的环游
  4. Kali Linux安装VMware Tools
  5. 算法周记(一)直接插入排序
  6. Mysql创建、删除用户
  7. go基础语法:数组定义
  8. jQuery event的复制粘贴的坑
  9. java GUI怎么输入_在Swing中创建Java GUI以进行表单输入
  10. C#/.Net操作MongoDBHelper类
  11. android 动态权限推送图标问题,「JPush」通知栏相关问题
  12. 多媒体计算机辅助英语教学,多媒体计算机辅助英语教学初探
  13. 微积分(一)——二重积分与三重积分笔记
  14. linux操作TF卡的命令
  15. jQuery stop()用法
  16. 团队协作工具调研笔记
  17. 微信小程序和uni-app面试高频知识点
  18. java计算机毕业设计特色农产品供需销售系统源码+数据库+系统+lw文档+mybatis+运行部署
  19. 惠普HP Deskjet Ink Advantage 3540 打印机驱动
  20. BCD码指令 AAA DAA AAS DAS AAM AAD

热门文章

  1. 【DIY】震精!他居然用esp8266做出掌上游戏机......恐龙跑酷游戏还能这样玩!请广泛转发!...
  2. 【S操作】我的云存储工具选择,供您参考——总结云存储云办公云笔记工具
  3. C++之指向对象成员函数的指针
  4. AWS Elastic Block Store和Simple Storage Services区别
  5. HttpRunner环境部署-踩坑篇
  6. we-rich 小程序渲染富文本js库
  7. 3.C#知识点:is和as
  8. 基于element-ui实现table可配置化
  9. 实现SQL Server 2012 镜像
  10. 微软企业库5.0学习笔记(四)配置企业库