@
frank1256 少年,你应该看看我的视频呀,有说明的。或者你去下载这个代码
https://github.com/traceless/nio-server ,里面有 NioServerDemo.java , 它模拟了 servlet 3.0 异步的实现( ps:实际有差异),但是你看完这个 demo ,你就知道它是怎么回事了,几百行代码。
测试方案,先启动里面有一个 nodejs 服务 7080 ,然后再启动 java 服务 8080 ,用浏览器随便访问一个 8080 地址即可,你就可以知道 全部真相了,非常叼。你一步一步的调试,就知道 nio 的异步写法是怎么回事了。现在回想下,其实 servlet3.0 就是解决 NIO 客户端实现的带来异步处理的问题。
另外你的代码例子有问题,没人这样用的,你这样用,死掉了啦。asyncContext.start() 用的是 tomcat/undertow 的 work 线程,等于白搞了。。。楼上 @
BBCCBB @
bthulu 2 位讲的都是很 oK 的,但是你理解的有偏差。你要用 servlet3.0 异步,正确使用如下图:
```
public void redisAsync( HttpServletRequest req) throws IOException {
final AsyncContext ctx = req.startAsync();
String key = "user:test:key";
this.repository.monoFindById(key).subscribe(data -> {
try {
ctx.getResponse().getWriter().print(data);
ctx.complete();
} catch (IOException e) {
e.printStackTrace();
}
});
}
```
@
NeoZephyr 你也要看看视频啊啦
https://www.bilibili.com/video/BV1FS4y1o7QB ,nio 对吞吐量提升很大。传统的 IO 因为是会阻塞的且阻塞时间不一致,所以需要不定量的线程,而 NIO 几个线程就 OK 了,无视 IO 时间,看完你肯定会很惊讶,记得三连哦。