Java:进行异步调用会增加线程数吗?

标签 java multithreading asynchronous

假设我有一个 Web 应用程序,对于每个请求,我们都会生成一个新线程。数以百计的请求进来,我们在 Web 服务器代码的某个地方同步调用多个服务,我们阻塞并等待。这种方法会增加我们拥有的线程数量,因为同步调用会造成瓶颈。

据推测,如果我们将这些调用切换为异步请求,我们就会摆脱瓶颈,因为线程可以继续,回调将处理任何需要发生的事情。

据我所知,在 Java 中,为了进行异步调用,我们生成了一个新线程来进行网络调用并包含回调(我不会实现这个,我假设这就是一些Java http 库工作)。

所以我的问题是,这如何解决许多线程的问题?异步请求最终会创建更多线程(每个请求一个),然后进入休眠状态直到返回某些内容,这不会创建很多 sleep 线程吗?

我试图解决的问题是,在某些时候,当线程过多时,JVM 会爆炸。

最佳答案

特别是在网络服务/servlet 环境中:

在最简单的配置中,常见的 Web 服务器(Jetty、Tomcat)配置有固定数量的线程,或者线程数量的范围。如果到达的请求多于线程,那么这些请求将堆积在内核连接队列中。线程接受连接并完成所有工作。发送响应后,该线程可用于另一个连接。添加您自己的线程池或执行程序服务对此无济于事。

在更复杂的配置中,Web 容器在一个线程池上接受连接,然后在另一个线程池上分派(dispatch)工作,中间有一个队列。然后,他们不会在连接时阻止客户端,或者让他们无法连接,他们只是等待。

在异步 Servlet 处理中,例如 JAX-RS @suspended AsyncResponse 对象,您可以自己控制细节。 servlet 使用包含连接的数据结构调用您。您的代码可以将该对象放入某个队列(可能只是 Executor 服务中内置的队列),然后返回。这释放了 Web 服务器线程以接受另一个容器。您的线程(可能来自执行程序服务)通过队列工作,处理请求并发送响应。

您永远不会创建无限数量的线程。

关于Java:进行异步调用会增加线程数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34685439/

相关文章:

java - 是否可以使用 Unix 套接字在 C 应用程序和 Java 应用程序之间创建通信?

java - 无法挂起线程来访问 Android 中的 UI

Java 泛型 - 方法参数和方法返回类型的编译错误

java - Birt 中的日期参数验证

java - 仅使用整数计算 2^n%k

java - 在调用 EJB 方法时中断客户端线程的正确方法是什么?

java - 与 KeyListener 并行运行的方法

javascript - 调用组件时的竞争条件

c# - 如何在异步 ASP.NET Web 服务调用上定义客户端超时?

javascript - 为什么我的 $q.defer().resolve 不起作用?