我会尽量总结我所学到的东西。据了解,Servlet的3.0和Servlet 3.1解决这个问题,让我们来看看这样说:
此前Servlet的3.0:
长期运行的线程导致线程匮乏。在Servlet 3.0之前,针对这些长时间运行的线程有特定于容器的解决方案,我们可以产生一个单独的工作线程来执行繁重的任务,然后将响应返回给客户端。在启动工作线程后,servlet线程返回到servlet池。 Tomcat的Comet,WebLogic的FutureResponseServlet和WebSphere的Asynchronous Request Dispatcher是实现异步处理的一些例子。
(更多信息请参见link 1)
的Servlet 3.0异步:
实际工作可以委托给一个线程池实现(独立容器特定的解决方案)。 Runnable
实现将执行实际处理,并将使用AsyncContext
将请求分派到另一个资源或写入响应。我们还可以将AsyncListener实现添加到AsyncContext对象以实现回调方法。
(更多信息参见link 1。)
的Servlet 3.1 NIO:
的Servlet 3.0允许异步请求处理,但只有传统的I/O被允许。传统I/O如何影响处理?那么,如果进入服务器(I/O)的数据阻塞或流传输速度慢于服务器可读,则服务器线程必须等待该数据。另一方面,如果数据写入ServletOutputStream
的速度较慢,则客户端线程必须等待。此问题通过ReadListener
和WriteListener
接口解决。这些注册在ServletInputStream
和ServletOutputStream
。监听器具有回调方法,当内容可用于读取或者可以在没有阻塞的情况下被写入时,这些回调方法被调用。
(更多信息请参见link 2)
现金 http://www.journaldev.com/2008/async-servlet-feature-of-servlet-3
https://blogs.oracle.com/arungupta/entry/non_blocking_i_o_using