概述
之前研究了下servlet的异步和非阻塞原理,看到一篇文章,下面有两个问题,顺便解答了下
servlet3异步原理与实践
Danniel
3楼 2019.05.18 21:31
请问,AsyncLongRunningServlet.java中使用了ThreadPool,其实在Servlet3.0之前,我们不也可以用ThreadPool实现异步(将request和response对象传入即可)吗???这个servlet3.0的异步的真正意义在哪里呢?指教
foolgry
02.26 16:43
将response对象传入自定义线程池中的线程,这个response对象是和tomcat线程池绑定的,也就是说,虽然你异步了,但是tomcat的工作线程还是没有释放,资源还是在占用。而servlet3.0的异步指的是tomcat的工作线程已经还给线程池,这里异步真正的意思是tomcat的工作线程和业务线程的异步,tomcat的工作线程不用同步等待业务线程的结果,而你利用线程池实现的,tomcat的工作线程还是没有释放,还是在同步等待。
所以总结下,
- 异步是针对tomcat的工作线程来说的,不是自己起的异步线程来说
- response对象返回给调用放,需要依赖tomcat的工作线程,自己起异步线程,通过response对象返回,实际上还是通过tomcat的工作线程返回的,在这个过程中,tomcat的工作线程并没有释放。
- tomcat怎么实现的呢,将response对象缓存起来,和tomcat的工作线程不强绑定,当使用异步时,将请求数据给业务线程前,会在事件驱动器注册几个回调,将请求数据给业务线程后,直接将工作线程直接返回给线程池,业务线程超时或者完成任务时,会回调,tomcat会重新拉起(从线程池中取出来一个)工作线程,将缓存的response对象给这个工作线程,完成请求的响应。这里的缓存的response对象是个不准确的说法,因为实际的对象不是这个,而是经过包装的其他对象。
莫那一鲁道
2楼 2018.07.10 00:32
自从Servlet3.1以后增加了非阻塞的IO,这里的非阻塞IO是面向inputstream和outputstream流,通过jdk的事件驱动模型来实现,更一步增强了Servlet异步的高性能,可以认为是一种增强版的异步机制。
如果不是 NIO,如何实现非阻塞呢?事件驱动模型类似观察者模式,但 IO 依然是阻塞的吧?
BIO 也可以实现异步(再加一个线程池就可以了),但他仍然是阻塞的。
NIO + 异步,可以提高系统的并发能力(TCP 连接数),并且 IO 不阻塞。
最后,仍然不是很理解,事件模型怎么能够实现非阻塞 IO?
foolgry
02.26 16:51
阻塞IO和非阻塞IO,区别就是读取文件或者网络的时候,进程或者线程是否停住,不能执行其他的代码,3.0和3.1的区别就是inputstream和outputstream流的读取一个是同步阻塞读取,一个是回调机制 ,你去读,读完了告诉我。你简单想一下就是同步读文件和异步读文件的区别。这里的回调机制依赖于事件模型,所以事件模型能够实现非阻塞IO。
要看这方面的知识,推荐这几篇文章,说的比较清楚
Servlet- 技术专题 -Servlet3 异步原理与实践
tomcat源码简析 异步/非阻塞和请求构成
tomcat servlet3的异步化原理理解
深入剖析通信层和 RPC 调用的异步化(下)
看到一篇tomcat的文章,Servlet 3 性能调优
Servlet 3 性能调优
最后
以上就是健康长颈鹿为你收集整理的servlet的异步和非阻塞原理 的全部内容,希望文章能够帮你解决servlet的异步和非阻塞原理 所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复