博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在耗时较长的Controller中使用Future异步
阅读量:6257 次
发布时间:2019-06-22

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

hot3.png

有一些Controller要算一些东西,可能会耗时较长,我们以休眠2秒来模拟这个过程。

代码如下

public class Dog implements Serializable {    private String name;    private int age;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }}
@RestControllerpublic class DogController {    @GetMapping("/getdog")    public Dog getDog() throws InterruptedException {        Dog dog = new Dog();        dog.setName("mimi");        dog.setAge(1);        Thread.sleep(2000);        return dog;    }    @GetMapping("/syncgetdog")    public Callable
syncGetDog() { Callable
dog = new Callable
() { @Override public Dog call() throws Exception { Dog midog = new Dog(); midog.setName("mimi"); midog.setAge(1); Thread.sleep(2000); return midog; } }; return dog; }}

这里我们使用了两种方式来获取一条狗的名字和年龄。第一种是最传统的单线程返回。第二种采用了Future模式的异步返回。我们对性能进行一次压测,压测的线程数1000,循环5次,共5000次。

5d0d7f22a8690e826171d0f3f8d6bc3a9b7.jpg

我们先来压第一个getdog

763579c938ea6762ff02ea7cf8db8ae334a.jpg

压测结果如下

1f47c85c7265fdfcc390048ffe1a5c31b7f.jpg

通过该结果我们可以看到吞吐量为96.9,最小响应时间2秒6,最大响应时间10秒3(当然这是我本机的压测,非服务器,数值量会偏小)

然后我们对异步调用进行压测

4759637f79218786fc3d7c27b86da5c4c16.jpg

压测结果如下

7441903d6e316df2f7aee02609c5a0ef49b.jpg

吞吐量379.2,最小响应时间2秒,最大响应时间3秒。

原因主要在于单线程的程序一条道走到黑,不运行完绝不撒手,Tomcat的可用线程被完全霸占。而Future模式的异步调用则是另外启动一个线程将Callable交给TaskExecutor去处理,Tomcat自己的主线程退出,去重新接收其他的请求调用,等到Callable执行结束后,就会重新启动分配一个request请求,调用和处理Callable异步执行的返回结果,然后最终返回结果。

但这里有一点需要说明,当一个请求处理及其短时间的时候,不要使用Future模式的异步调用,性能反而不如单线程模式。

转载于:https://my.oschina.net/u/3768341/blog/2575151

你可能感兴趣的文章
设计模式初探之建造者模式(Builder)
查看>>
菜鸟学网络之 —— 长连接和短连接
查看>>
DDFE 技术周刊(第十八期)2017.3.14
查看>>
安得广厦千万间,大赚天下寒士俱欢颜
查看>>
这是一份优美的信息图,吴恩达点赞的deeplearning.ai课程总结
查看>>
去中心化并不是比特币的关键和核心,真的有用才是
查看>>
0629 - 基本完成 iPaste 的 Pin 管理
查看>>
经典:头像与昵称描述的位置组合
查看>>
【CSS模块化之路2】webpack中的Local Scope
查看>>
浙江移动容器云基于 Dragonfly 的统一文件分发平台生产实践
查看>>
「每日一瞥
查看>>
java 线程池
查看>>
排序算法总结
查看>>
python模块学习(二)
查看>>
近期的爬虫工作杂谈
查看>>
机器学习之 k 近邻
查看>>
canvas核心技术-如何绘制图形
查看>>
netty源码分析之pipeline(二)
查看>>
面试:讲讲 Android 的事件分发机制
查看>>
计算机程序的思维逻辑 (95) - Java 8的日期和时间API
查看>>