异步处理J2EE

时间:2017-01-18 18:11:37

标签: java multithreading servlets java-ee asynchronous

在Servlet 3.0中引入了异步处理的概念。所以所有的书都说每个请求消除了一个线程的要求。我测试了它,是的,它确实有效。现在,我有一个简单的servlet,用户在同步模式下发起HTTP请求。线程只是休眠1秒钟然后回复客户端。当我针对此模式进行负载测试时,服务器每秒只能处理4个请求。 现在,我将同步模式更改为异步模式,并根据请求创建新线程,将原始http线程释放回池。同样,新线程启动休眠1秒钟并回复。但是,这种模式非常好,它每秒处理数百个请求。

现在,问题是,所有书籍和文章都说服务器的资源数量有限,因此每个请求保留一个帖子并不好。在这两种情况下,每个请求都有一个线程,主要区别在于,第一个是http线程,第二个是我的自定义线程。现在的问题是,HTTP线程有什么特别的,而不是我的自定义线程?毕竟,在这两种情况下,我们每个请求都有一个线程,为什么第一个执行不好但第二个不执行?我经历了很多文件,书籍都没有解释那些棘手的细节。你能给我一些建议吗?谢谢

1 个答案:

答案 0 :(得分:0)

AFAIK,HTTP线程和Asychronous Threads之间没有区别......

您看到性能升级是因为HTTP线程(大多数)是作为固定的N大小的线程池实现的;这意味着最后将同时处理N个服务器请求...任何其他请求将阻塞(或拒绝),直到一个或多个线程变为空闲。

在异步模式下,这些N个线程被非常快速地使用和释放,因为艰苦的工作(创建响应对象)正在另一个线程中完成;允许您继续接收更多命中请求。

根据您实现后台线程的方式,您将看到性能升级。例如,如果您还将线程实现为固定的M大小池,其中M大于N,您将看到处理中M - N个请求的增量。