本文共 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/