博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
阻塞队列的使用案例-注册成功后增加积分
阅读量:2163 次
发布时间:2019-05-01

本文共 1946 字,大约阅读时间需要 6 分钟。

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

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

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

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

 

转载地址:http://ksbzb.baihongyu.com/

你可能感兴趣的文章
深入理解JVM虚拟机6:深入理解JVM类加载机制
查看>>
深入了解JVM虚拟机8:Java的编译期优化与运行期优化
查看>>
深入理解JVM虚拟机9:JVM监控工具与诊断实践
查看>>
深入理解JVM虚拟机10:JVM常用参数以及调优实践
查看>>
深入理解JVM虚拟机11:Java内存异常原理与实践
查看>>
深入理解JVM虚拟机12:JVM性能管理神器VisualVM介绍与实战
查看>>
深入理解JVM虚拟机13:再谈四种引用及GC实践
查看>>
Spring源码剖析1:Spring概述
查看>>
Spring源码剖析2:初探Spring IOC核心流程
查看>>
Spring源码剖析3:Spring IOC容器的加载过程
查看>>
Spring源码剖析4:懒加载的单例Bean获取过程分析
查看>>
Spring源码剖析5:JDK和cglib动态代理原理详解
查看>>
Spring源码剖析6:Spring AOP概述
查看>>
Spring源码剖析7:AOP实现原理详解
查看>>
Spring源码剖析8:Spring事务概述
查看>>
Spring源码剖析9:Spring事务源码剖析
查看>>
重新学习Mysql数据库1:无废话MySQL入门
查看>>
探索Redis设计与实现2:Redis内部数据结构详解——dict
查看>>
探索Redis设计与实现3:Redis内部数据结构详解——sds
查看>>
探索Redis设计与实现4:Redis内部数据结构详解——ziplist
查看>>