【问题标题】:Async processing J2EE异步处理 J2EE
【发布时间】:2017-06-03 06:03:07
【问题描述】:

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

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

【问题讨论】:

    标签: java multithreading servlets jakarta-ee asynchronous


    【解决方案1】:

    AFAIK,HTTP 线程和异步线程之间没有区别......

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

    在异步模式下,这 N 个线程的使用和释放速度非常快,因为繁重的工作(创建响应对象)正在另一个线程中完成;让您继续接收更多的点击请求。

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

    【讨论】:

      猜你喜欢
      • 2011-01-01
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 2011-05-30
      • 2016-04-29
      • 2018-08-21
      • 2022-10-14
      相关资源
      最近更新 更多