Java 要在线程池中创建多少线程

Java 要在线程池中创建多少线程,java,multithreading,Java,Multithreading,目前我正在开发一个可以在多线程模式下工作的应用程序。作为在本地计算机(Intel Core I5)上测试的一部分,我使用4个线程进行了测试。但是现在我们想要发布用于密集(回归)测试的代码,所以我们可以通过任何硬规则来决定要创建用于处理的线程数量 我没有使用任何web或应用程序服务器,而是编写了接收请求并进行处理的逻辑。现在,在处理过程中,我在主线程上接收到请求,然后我将调用提交到ExecuterService,在那里我需要确定线程的数量,然后我处理请求,每个线程都可以再次返回响应 我需要配置一个

目前我正在开发一个可以在多线程模式下工作的应用程序。作为在本地计算机(Intel Core I5)上测试的一部分,我使用4个线程进行了测试。但是现在我们想要发布用于密集(回归)测试的代码,所以我们可以通过任何硬规则来决定要创建用于处理的线程数量

我没有使用任何web或应用程序服务器,而是编写了接收请求并进行处理的逻辑。现在,在处理过程中,我在主线程上接收到请求,然后我将调用提交到
ExecuterService
,在那里我需要确定线程的数量,然后我处理请求,每个线程都可以再次返回响应

我需要配置一个最佳的线程数。我正在尝试将我的应用程序部署在16核、40GB内存的linux机器上


从理论上讲,最佳线程数等于机器中的内核数。 实际上,许多操作都在等待内存、IO、网络或磁盘

尝试只执行一个线程。如果CPU核心负载为25%,您可以尝试创建(机器中核心数的4倍)线程

请注意,增加线程数会影响每个线程等待网络/磁盘/内存/IO的时间,因此它会稍微复杂一些


您可以做的最好的事情是基准测试:测量完成1000000个模拟请求所需的时间-给定不同的线程数。

理论上,最佳线程数等于机器中的内核数。 实际上,许多操作都在等待内存、IO、网络或磁盘

尝试只执行一个线程。如果CPU核心负载为25%,您可以尝试创建(机器中核心数的4倍)线程

请注意,增加线程数会影响每个线程等待网络/磁盘/内存/IO的时间,因此它会稍微复杂一些


您可以做的最好的事情是基准测试:测量完成1000000个模拟请求所需的时间-给定不同的线程数。

应用程序的最大线程数无法通过一些定义良好的公式提取,但它取决于各种任务的性质和目标环境

  • 如果您的任务是CPU密集型的,那么如果生成太多线程,性能将下降,因为大部分时间将花在上下文切换上。
    对于计算密集型任务,一般公式为
    Ncpus+1
    。您可以使用
    Runtime.availableProcessor

  • 如果您的任务是I/O密集型的,那么在大多数情况下,您可以使用更多的线程,因为由于线程在阻塞任务上花费了如此多的时间,所有线程都是可调度的

因此,考虑到这两个因素,您应该通过探查器或其他类似工具估计
计算时间与等待时间


您可以尝试各种大小的基准测试,直到您估计出最适合您的情况。

应用程序的最大线程数无法通过一些定义良好的公式提取,但它取决于各种任务的性质和目标环境

  • 如果您的任务是CPU密集型的,那么如果生成太多线程,性能将下降,因为大部分时间将花在上下文切换上。
    对于计算密集型任务,一般公式为
    Ncpus+1
    。您可以使用
    Runtime.availableProcessor

  • 如果您的任务是I/O密集型的,那么在大多数情况下,您可以使用更多的线程,因为由于线程在阻塞任务上花费了如此多的时间,所有线程都是可调度的

因此,考虑到这两个因素,您应该通过探查器或其他类似工具估计
计算时间与等待时间


您可以尝试各种大小的基准测试,直到您估计出最适合您的情况。

取决于任务的cpu密集程度。但您仍然可以将一个任务分配给一个核心。因此,至少您可以创建与内核数量相同的线程。也就是说,事情可能会随着时间的推移而放缓

  • 您的代码执行大量I/O操作
  • 大量网络I/O
  • 其他CPU密集型任务

如果创建的线程太多,则会在上下文切换中浪费大量时间。除非您可以根据自己的测试来进行基准测试,否则使用线程=核心数。

取决于任务的cpu密集程度。但您仍然可以将一个任务分配给一个核心。因此,至少您可以创建与内核数量相同的线程。也就是说,事情可能会随着时间的推移而放缓

  • 您的代码执行大量I/O操作
  • 大量网络I/O
  • 其他CPU密集型任务

如果创建的线程太多,则会在上下文切换中浪费大量时间。除非你能根据自己的测试得出一个基准,否则就用threads=核心数。

我会说你的开场白是错误的,但其余的都是很好的建议。对于cpu密集型任务,它实际上是
cpu数+1
这个计算对于一直忙碌的线程来说是可以的。但是,如果你有一个应用程序,例如通过internet进行通信的应用程序,它通常会等待响应,那么你可以使用更多线程。我会说你的开场白是错误的,但其余的都是很好的建议。对于cpu密集型任务,它实际上是
cpu数量+1
这个计算对于所有时间都很忙的线程来说是可以的。但是,如果您有一个应用程序(例如,通过internet进行通信的应用程序)经常等待响应,那么您可以使用更多线程