阻塞队列的使用案例-注册成功后增加积分
假如我们模拟一个场景,就是用户注册的时候,在注册成功以后发放积分。这个场景在一般来说,我们会这么去实现
但是实际上,我们需要考虑两个问题
1. 性能,在注册这个环节里面,假如添加用户需要花费1秒钟,增加积分需要花费1秒钟,那么整个注册结果的返回就可能需要大于2秒,虽然影响不是很大,但是在量比较大的时候,我们也需要做一些优化
2. 耦合,添加用户和增加积分,可以认为是两个领域,也就是说,增加积分并不是注册必须要具备的功能,但是一旦增加积分这个逻辑出现异常,就会导致注册失败。这种耦合在程序设计的时候是一定要规避的
因此我们可以通过异步的方式来实现
改造之前的代码逻辑
public class UserService { public boolean register(){ User user=new User(); user.setName("Mic"); addUser(user); sendPoints(user); return true; } public static void main(String[] args) { new UserService().register();} private void addUser(User user){ System.out.println("添加用户:"+user); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } private void sendPoints(User user){ System.out.println("发送积分给指定用户:"+user); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }
}
改造之后的逻辑
public class UserService { private final ExecutorService single = Executors.newSingleThreadExecutor(); private volatile boolean isRunning = true; ArrayBlockingQueue arrayBlockingQueue=new ArrayBlockingQueue(10); { init(); } public void init(){ single.execute(()->{ while(isRunning){ try { User user=(User)arrayBlockingQueue.take();//阻塞的方式获取队列中的数据sendPoints(user); } catch (InterruptedException e) { e.printStackTrace(); } } }); } public boolean register(){ User user=new User(); user.setName("Mic"); addUser(user); arrayBlockingQueue.add(user);//添加到异步队列 return true; } public static void main(String[] args) { new UserService().register(); } private void addUser(User user){ System.out.println("添加用户:"+user); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } private void sendPoints(User user){ System.out.println("发送积分给指定用户:"+user); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }
}
优化以后,整个流程就变成了这样
阻塞队列的使用案例-注册成功后增加积分相关推荐
- 实现注册成功后会自动发送邮件到账户(时间以及ip)
模板参考python前段页面制作-Flask续最后的案例 改动app.py里的register函数,使得在验证注册成功后进行发送邮件操作 代码部分: 首先import socket,datetime ...
- dubbo 服务注册成功后出现 Failed to invoke the method * in the *
记录一下实际开发中出现的问题 问题描述 真实环境中需要部署新功能,需要重启之前的项目,但在重启过程中发现大量的端口处于 time wait ,导致端口被占用,项目启动失败.重新修改端口后启动成功并注册 ...
- 注册成功后无法登录问题
用户注册成功后,使用密码进行登录,提示密码错误.(url请求正常,json信息正常返回)数据库中保存的是使用MD5加密后的算法. public ResultVO checkLogin(String u ...
- 写的一个网页登录注册模板(css+js),注册成功后把账号保存到MySQL数据库,登录时从数据库查找进行验证(jsp+javabean)
首先是网页前端的设计,使用css美化(字体使用Google font,图标使用font awemome,颜色使用palettes|flat ui colors,谷歌可找到,个人觉得挺好用) 使用了简单 ...
- 公网部署freeswitch1.8.6后,终端注册成功后,在fs_cli控制台执行originate user/1000 echo,呼通1000的SIP终端后,终端讲话没有收到fs的回声解决方法
由于freeswitch是在公网部署,首先修改了conf/sip_profiles/internal.xml中的ext-rtp-ip和ext-sip-ip为对应主机的公网IP地址,然后启动freesw ...
- J.U.C 学习(三)之 “阻塞队列”
生产者消费者的实际使用 相信大家都有使用过分布式消息队列,比如 ActiveMQ. kafka.RabbitMQ 等等,消息队列的是有可以使得程序之间实现解耦,提升程序响应的效率. 如果我们把多线程环 ...
- 让人抓头的Java并发(四) 阻塞队列--CPU飙升排查案例
在上一篇文章中给大家介绍了牛批的AQS,大致讲解了JUC中同步的思路.本来还没想好这一篇应该写点什么,刚好上周某个同事的代码出现问题,排查后发现是使用阻塞队列不当导致的,所以本篇决定介绍下阻塞队列. ...
- 需求:有一个首页,首页中有登录和注册 1. 点击注册进入注册页面。成功注册后,在页面中显示 “恭喜您,注册成功,页面内将在5秒后跳转到个人主页,点击这里立即跳转” 。进入个人主页后显示当前的时间。
1.项目所需的jar包 导包:c3p0包.dbut ils包.servlet包,c3p0依赖包以及c3p0文件配置. 创建一个数据库day0914,并创建一个表user用于数据的存储. 数据库相关的包 ...
- Java中阻塞队列类型介绍
Java中的几种阻塞队列 Java中的BlockingQueue接口是一个线程安全的存取队列,适用于生产者消费者的应用场景中,支持两个附加操作: 生产者线程会一直不断的往阻塞队列中放入数据,直到队列满 ...
最新文章
- sshd服务java教程_Windows下安装OpenSSH服务教程
- CSS常见的四种垂直居中的方法
- net如何判断浏览器的类别
- Cobar部署与测试
- Turtlebot2 环境配置
- echart 三维可视化地图_Echarts百度可视化图形库
- 通过镜像快速搭建本地yum源
- 基于分数阶的图像边缘细节检测
- jemalloc 内存管理
- excel宏-自定义筛选查询
- Protocol(基本语法和使用场景)
- 服务器2008修改虚拟内存,Windows 2008 关闭系统虚拟内存功能 如何删除pagefile.sys
- 17所大学!考研计算机/软件专业课变化的大学名单!【20考研】
- 甲基化系列 1. 甲基化之前世今生(Methylation)
- 关于宠物饮水机的问题与设计
- 【3D建模制作技巧分享】zbrush中如何卡硬边?
- GaussDB(DWS)介绍
- 迅睿cms免费开源系统 v4.3.14
- Windows 中安装 MariaDB 数据库
- 密码学系列之:NIST和SHA算法