【问题标题】:What is the best way to control thread creation in Java on a given machine?在给定机器上控制 Java 线程创建的最佳方法是什么?
【发布时间】:2020-06-06 14:50:48
【问题描述】:

在我的应用程序中,我想根据用户的输入创建线程。 例如,如果用户提供 10 个,我只需创建一个包含 10 个线程的池来执行某些操作。无法控制用户的输入。如果用户提供 10k 作为输入,我不想创建 10k 线程。这对机器来说太过分了。有什么建议吗?

如何控制线程池计数?
如何计算我可以在给定机器上创建的最大线程数?

【问题讨论】:

  • 无法控制用户的输入...:好吧,您拥有(并且想要)控制权。所以,createThreads(Math.min(userInputNumber, maximumAllowedBySystemConfig))。如果用户可以重复请求,请跟踪您创建了多少。

标签: java multithreading concurrency operating-system threadpool


【解决方案1】:

有什么建议吗?

如果不对生产环境中的应用程序进行一些分析并获得一些真实的统计数据来帮助您确定达到 CPU 最大使用率的最佳条件(请参阅 Amdahl’s law),这将无法轻松实现。

也就是说,有一件事是肯定的,而且您已经知道:您创建的线程数不应超过最适合您的运行环境的数量。

Java Concurrency in Practice做一个总结:

Item 8.2 调整线程池大小

线程池的理想大小取决于任务的类型 将提交和部署系统的特点。 线程池大小应该很少被硬编码;而是池大小 应该由配置机制提供或计算 动态咨询Runtime.availableProcessors

例如,

对于计算密集型任务,通常使用 Ncpu 处理器系统 使用 Ncpu + 的线程池实现最佳利用率 1 个线程。

给定

Ncpu = CPU 数量

Ucpu = 目标 CPU 利用率,0 ≤ U cpu ≤ 1

W/C = 等待时间与计算时间的比率

将处理器保持在所需的最佳池大小 利用率是:

(这应该回答 如何计算我可以在给定机器上创建的最大线程数?

N线程 = Ncpu * Ucpu * (1 + W/C)

您可以使用来确定可用 CPU 的数量

int numberOfCPU = Runtime.getRuntime().availableProcessors();

如何控制线程池数量?

您可以(并且应该)使用添加到 Java 中的任何 concurrent 类,而不是自己创建和管理 Threads。例如ThreadPoolExecutor

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    相关资源
    最近更新 更多