Java - 可以扩展到最大和最小的线程池

问题描述 投票:0回答:1

是否可以有一个以 4 个工作线程开头的线程池。假设 4 个线程一开始是空闲的。最终,他们开始工作,我不知道,也许是从他们可能正在侦听的网络套接字开始,他们都变得忙碌,我想在这一点上通过添加四个工作人员来增加池八。然后线程将变得空闲,这意味着它们将返回侦听端口,直到有更多工作到达。在任何时间点,其中一些可能会闲置一段时间,比如说 60 秒。此时我想通过终止/中断一些空闲线程来将池减少回 4 个。

总之,池从 4 个开始,但如果它们在任何时候都变得活跃,我希望再有 4 个,总共最多 8 个。然后最终缩小到原来的大小。

现在有一个固定大小的线程池。

java multithreading threadpool threadgroup dynamic-sizing
1个回答
0
投票

您所要求的已经在ThreadPoolExecutor中实现了。来自文档

核心和最大池大小

ThreadPoolExecutor 将根据 corePoolSize(请参阅 getCorePoolSize())和 maxPoolSize(请参阅 getMaximumPoolSize())设置的边界自动调整池大小(请参阅 getPoolSize())。当在方法execute(Runnable)中提交新任务时,如果运行的线程少于corePoolSize,则会创建一个新线程来处理该请求,即使其他工作线程处于空闲状态。否则,如果正在运行的线程少于 maxPoolSize,则仅当队列已满时才会创建一个新线程来处理请求。通过将 corePoolSize 和 MaximumPoolSize 设置为相同,您可以创建固定大小的线程池。通过将 MaximumPoolSize 设置为本质上无界的值(例如 Integer.MAX_VALUE),您可以允许池容纳任意数量的并发任务。最典型的是,核心和最大池大小仅在构造时设置,但也可以使用 setCorePoolSize(int) 和 setMaximumPoolSize(int) 动态更改。

© www.soinside.com 2019 - 2024. All rights reserved.