gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:16:27 26 4
gpt4 key购买 nike

假设我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com