在REST控制器java中创建多个线程的影响

在REST控制器java中创建多个线程的影响,java,multithreading,rest,Java,Multithreading,Rest,我有一个REST控制器类。在这个类中有一个方法,它必须并行执行两个独立的服务,如下所示- @GetMapping("/hello") public String getResult(){ //Call service 1 // Call service 2 // Combine the result and return } 因为这两个服务可以独立执行,所以我们在固定线程池中创建两个线程并并行执行它们。现在我的问题是,由于我的REST API同时被成千

我有一个REST控制器类。在这个类中有一个方法,它必须并行执行两个独立的服务,如下所示-

@GetMapping("/hello")
public String getResult(){
    //Call service 1
    // Call service 2
   // Combine the result and return
}
因为这两个服务可以独立执行,所以我们在固定线程池中创建两个线程并并行执行它们。现在我的问题是,由于我的REST API同时被成千上万的用户调用,
这意味着我的代码将创建1000*2个线程?或者它将只创建2个线程并与多个servlet线程共享?

我假设您的线程池是在应用程序级别的方法之外定义的。这是正确的做法。因此,整个应用程序将有两个工作线程(一个JVM实例)

现在假设,您同时收到来自用户的1000个请求。然后,您的应用程序将创建1000个HTTP线程。这1000个HTTP线程将争夺您在Executor线程池中定义的两个工作线程。因此,它将阻塞应用程序。由于HTTP线程将等待访问线程池,所以响应时间将越来越长。最终,它将耗尽应用程序的资源


因此,您需要相应地增加线程池的大小。

您可以分享创建线程池的代码吗?将有1000多个(1000*2)线程。由于每个API调用跨越单独的线程,所以API调用需要1000个线程,每个API调用跨越单独的2个线程,所以(1000*2)。所以总共3000个线程。线程池是在方法内部定义的,而不是类级别。这不是一个好主意。线程池用于控制线程数。如果它在方法内部,那么每次请求到来时都将创建新的线程池。因此,您将有1000*2个工作线程。太多的线程会杀死应用程序,因为线程占用自己的资源。这就是为什么要使用线程池。它还有助于减少新线程的创建开销。但是您使用的方式并没有利用线程池的任何优势。谢谢您的评论。我看到在类级别创建线程池不是个好主意,在方法级别创建线程池也不是个好主意。您认为处理这种情况的最佳方法是什么?线程池应该在应用程序级别创建。一个应用程序可以有多个线程池,根据使用它的模块有自己的配置。类级别(应用程序级别)是个好主意。但是对于1000个请求,2个工作线程是不够的。你可能需要把尺寸增加到100或200。取决于服务器配置。您必须对其进行负载测试。