java - 在给定机器上控制 Java 线程创建的最佳方法是什么?
问题描述
在我的应用程序中,我想根据用户的输入创建线程。例如,如果用户提供 10 个,我只需创建一个包含 10 个线程的池来执行某些操作。无法控制用户的输入。如果用户提供 10k 作为输入,我不想创建 10k 线程。这对机器来说太过分了。有什么建议吗?
如何控制线程池计数?
如何计算可以在给定机器上创建的最大线程数?
解决方案
有什么建议吗?
如果不对生产环境中的应用程序进行一些分析并获得一些真实的统计数据来帮助您确定达到 CPU 最大使用率的最佳条件(参见Amdahl 定律),这将无法轻松实现。
也就是说,有一件事是肯定的,而且您已经知道:您创建的线程数不应超过最适合您的运行环境的数量。
从Java Concurrency in Practice做一个总结:
项目 8.2 调整线程池大小
线程池的理想大小取决于将提交的任务类型和部署系统的特性。线程池大小应该很少被硬编码;相反,池大小应由配置机制提供或通过咨询动态计算
Runtime.availableProcessors
。
例如,
对于计算密集型任务,N cpu处理器系统通常通过 N cpu + 1 个线程的线程池实现最佳利用率。
并给出
N cpu = CPU 数量
U cpu = 目标 CPU 利用率,0 ≤ U cpu ≤ 1
W/C = 等待时间与计算时间的比率
将处理器保持在所需利用率的最佳池大小是:
(这应该回答如何计算我可以在给定机器上创建的最大线程数?)
N个线程= N cpu * U cpu * (1 + W/C)
您可以使用以下方法确定可用 CPU 的数量
int numberOfCPU = Runtime.getRuntime().availableProcessors();
如何控制线程池计数?
您可以(并且应该)使用添加到 Java 中的任何并发类,而不是自己创建和管理Thread
s。例如ThreadPoolExecutor
.
推荐阅读
- xml - 将带有 XML 内容的 http(s) 请求发布到 Power BI
- android - 服务可以在android中停止的原因
- angular - 与 DOM 解耦并将功能引入指令
- python - 詹金斯:int()的无效文字(以10为底):'within' Build
- javascript - JS构造函数类范围错误
- slack - 对需要 SSO 的端点的 Slack API 请求
- java - 在函数中使用字符串参数是好是坏?
- .net-core - NetTopologySuite 将多多边形压缩为多边形
- matlab - 用 MATLAB 中的其他表达式表达一个表达式
- python - 线性趋势线呈现非线性