假如我们模拟一个场景,就是用户注册的时候,在注册成功以后发放积分。这个场景在一般来说,我们会这么去实现

但是实际上,我们需要考虑两个问题

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(); } }
}

优化以后,整个流程就变成了这样

阻塞队列的使用案例-注册成功后增加积分相关推荐

  1. 实现注册成功后会自动发送邮件到账户(时间以及ip)

    模板参考python前段页面制作-Flask续最后的案例 改动app.py里的register函数,使得在验证注册成功后进行发送邮件操作 代码部分: 首先import socket,datetime ...

  2. dubbo 服务注册成功后出现 Failed to invoke the method * in the *

    记录一下实际开发中出现的问题 问题描述 真实环境中需要部署新功能,需要重启之前的项目,但在重启过程中发现大量的端口处于 time wait ,导致端口被占用,项目启动失败.重新修改端口后启动成功并注册 ...

  3. 注册成功后无法登录问题

    用户注册成功后,使用密码进行登录,提示密码错误.(url请求正常,json信息正常返回)数据库中保存的是使用MD5加密后的算法. public ResultVO checkLogin(String u ...

  4. 写的一个网页登录注册模板(css+js),注册成功后把账号保存到MySQL数据库,登录时从数据库查找进行验证(jsp+javabean)

    首先是网页前端的设计,使用css美化(字体使用Google font,图标使用font awemome,颜色使用palettes|flat ui colors,谷歌可找到,个人觉得挺好用) 使用了简单 ...

  5. 公网部署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 ...

  6. J.U.C 学习(三)之 “阻塞队列”

    生产者消费者的实际使用 相信大家都有使用过分布式消息队列,比如 ActiveMQ. kafka.RabbitMQ 等等,消息队列的是有可以使得程序之间实现解耦,提升程序响应的效率. 如果我们把多线程环 ...

  7. 让人抓头的Java并发(四) 阻塞队列--CPU飙升排查案例

    在上一篇文章中给大家介绍了牛批的AQS,大致讲解了JUC中同步的思路.本来还没想好这一篇应该写点什么,刚好上周某个同事的代码出现问题,排查后发现是使用阻塞队列不当导致的,所以本篇决定介绍下阻塞队列. ...

  8. 需求:有一个首页,首页中有登录和注册 1. 点击注册进入注册页面。成功注册后,在页面中显示 “恭喜您,注册成功,页面内将在5秒后跳转到个人主页,点击这里立即跳转” 。进入个人主页后显示当前的时间。

    1.项目所需的jar包 导包:c3p0包.dbut ils包.servlet包,c3p0依赖包以及c3p0文件配置. 创建一个数据库day0914,并创建一个表user用于数据的存储. 数据库相关的包 ...

  9. Java中阻塞队列类型介绍

    Java中的几种阻塞队列 Java中的BlockingQueue接口是一个线程安全的存取队列,适用于生产者消费者的应用场景中,支持两个附加操作: 生产者线程会一直不断的往阻塞队列中放入数据,直到队列满 ...

最新文章

  1. sshd服务java教程_Windows下安装OpenSSH服务教程
  2. CSS常见的四种垂直居中的方法
  3. net如何判断浏览器的类别
  4. Cobar部署与测试
  5. Turtlebot2 环境配置
  6. echart 三维可视化地图_Echarts百度可视化图形库
  7. 通过镜像快速搭建本地yum源
  8. 基于分数阶的图像边缘细节检测
  9. jemalloc 内存管理
  10. excel宏-自定义筛选查询
  11. Protocol(基本语法和使用场景)
  12. 服务器2008修改虚拟内存,Windows 2008 关闭系统虚拟内存功能 如何删除pagefile.sys
  13. 17所大学!考研计算机/软件专业课变化的大学名单!【20考研】
  14. 甲基化系列 1. 甲基化之前世今生(Methylation)
  15. 关于宠物饮水机的问题与设计
  16. 【3D建模制作技巧分享】zbrush中如何卡硬边?
  17. GaussDB(DWS)介绍
  18. 迅睿cms免费开源系统 v4.3.14
  19. Windows 中安装 MariaDB 数据库
  20. 密码学系列之:NIST和SHA算法

热门文章

  1. Andriod: 在xml布局中使用自定义属性
  2. fedora 15中使用evolution获取exchange邮件
  3. 机器学习之路:python k近邻回归 预测波士顿房价
  4. 根据json对象的某一属性对其进行排序
  5. 实验九——基本数据类型存储及应用总结
  6. 【NOIP普及组】2016模拟考试(10.29)——排座椅
  7. cdoj 秋实大哥搞算数
  8. 命名规范(1)大小写约定
  9. delphi中combobox键值对
  10. JVM 分析工具和查看命令,超详细