Java 创建大型固定线程池的后果
我正在开发一个标准的服务器应用程序。每个请求的处理都分为几个阶段(第二阶段要求完成第一阶段,依此类推)。现在,其中一个阶段需要相当长的时间,但它本身可以分解为几十个左右的任务,这些任务彼此不依赖,因此是可并行的。我想在Java 创建大型固定线程池的后果,java,multithreading,concurrency,threadpool,Java,Multithreading,Concurrency,Threadpool,我正在开发一个标准的服务器应用程序。每个请求的处理都分为几个阶段(第二阶段要求完成第一阶段,依此类推)。现在,其中一个阶段需要相当长的时间,但它本身可以分解为几十个左右的任务,这些任务彼此不依赖,因此是可并行的。我想在SlowStageService中添加一个线程池,我想知道如何最好地调整它的大小。线程池最好在大多数情况下至少有一个空缺,这意味着它处理任务的速度必须与服务器接收请求的速度相同或更快;这会产生线程池大小的合理下限。然而,我想慷慨地确定尺寸,因为计算中涉及的许多数字可能会发生变化 所
SlowStageService
中添加一个线程池,我想知道如何最好地调整它的大小。线程池最好在大多数情况下至少有一个空缺,这意味着它处理任务的速度必须与服务器接收请求的速度相同或更快;这会产生线程池大小的合理下限。然而,我想慷慨地确定尺寸,因为计算中涉及的许多数字可能会发生变化
所以我的问题是:让我的池太大(比如3或4倍),并且有很多空闲线程,有什么坏处?我知道它浪费了一些资源,但它实际上并没有保留任何CPU,从而使它无法用于其他请求,对吗?一个人在实践中通常可以有多少懈怠?假设我已经计算出6个线程是我所需要的最小值;在中等负载下,在24芯盒上使用12芯是否安全
在我写这篇文章时,听起来我需要的可能是一个范围相当窄(3或4倍)的
ThreadPoolExecutor
您应该参考Brian Goetz的《Java并发实践》一书中的第8.2节
如果您的阶段是计算密集型阶段,并且只有很少的I/O,那么线程池的最佳大小=CPU核心数+1(因此在您的情况下,它将是25)。
但是,如果阶段中存在I/O绑定任务,那么线程池实现最佳响应时间的最佳适用大小取决于各种因素: