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

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

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. 使用OpenCV构建会玩石头剪刀布的AI
  2. 19个决定性时刻,2030年前,这些黑科技必将发生
  3. IntelliJ IDEA 2017.3.2 热加载(Hot Swap)
  4. 新版谷歌浏览器怎么查找和改变编码格式
  5. Java 套接字Socket
  6. 你的灯亮着吗?阅读笔记之一
  7. canvas绘制多边形
  8. 机器学习相关的一些术语
  9. SpringBoot入门教程(十四)导出Excel
  10. Geotools解析shp文件
  11. BUGKU------秋名山老司机
  12. Unity IOS 录屏
  13. 小米组织架构调整:成立技术委员会 强化技术引领
  14. 手机变速齿轮_手机app变速齿轮
  15. 原腾讯QQ技术总监、T13专家,黄希彤被裁,原因竟是不愿意被 PUA ?
  16. 23、python对数据进行求和、方差、平均值等基本统计指标计算
  17. 2023 第一届“躺平杯”信息技术与网络安全入门赛
  18. DSS部署-2、环境准备
  19. CS_2023_01
  20. 增高助长~~~~~~~~~~~~

热门文章

  1. 软件设计思维:软件应该可以增大可以减小
  2. Flex itemRenderer 内联渲染器
  3. redis-Windows下安装与操作
  4. List集合的特有功能概述
  5. U盘的挂载和卸载(也可以查看指令篇)
  6. 【NOIP2016PJ】【Luogu2058】海港
  7. 【疑】poj 2773 Happy 2006 互素问题(★★☆☆☆)
  8. CentOS 7配置IP的几种方法。
  9. 替换SQL字段中的换行符,回车符
  10. python 自定义模块的发布和安装