【问题标题】:How to decide the suitable number of threads to create in java?如何决定在java中创建合适的线程数?
【发布时间】:2012-07-10 06:24:41
【问题描述】:

我有一个使用远程主机创建 SSL 套接字的 java 应用程序。我想使用线程来加速这个过程。

我想要不影响程序性能的最大可能利用率。如何确定要使用的合适线程数?运行以下行后:Runtime.getRuntime().availableProcessors(); 我得到了 4。我的处理器是 Intel core i7,具有 8 GB RAM。

【问题讨论】:

  • @DarthVader 我认为问题是:什么尺寸?
  • @DarthVader:我已经在使用游泳池了。但是我应该在池中定义多少个线程?我怎么知道哪个号码适合我的电脑?
  • 是的,您有两个选择,您可以创建一个固定的线程池,其大小与您机器中的内核数相同。或者你可以有一个线程池来按需创建更多线程。 stackoverflow.com/questions/1028707/…
  • 基本上你不应该担心你需要创建的核心数量和线程数量。影响线程切换的因素很多,虽然有线程切换,但其他线程可以利用CPU。所以每个核心一个线程并不能很好地应用。

标签: java multithreading


【解决方案1】:

如果您有 4 个内核,那么理论上您应该在任何给定时间恰好有四个工作线程运行以实现最大优化。不幸的是,理论上发生的事情在实践中从未发生过。您可能有工作线程,无论出于何种原因,它们都有大量的停机时间。也许他们正在上网获取更多数据,或者从磁盘读取,其中大部分只是在等待而不是使用 CPU。

根据您等待的时间,您可能会想要增加这个数字。增加线程数量的代价是您将有更多的上下文切换和资源竞争。好处是您将准备好另一个线程,以防其他线程中的一个决定它必须中断。

您最好的选择是将其设置为某个值(让我们从 4 开始)并逐步提高。使用每个设置分析您的代码,并查看您的基准是上升还是下降。您应该很快就会看到一个模式和一个盈亏平衡点。

在优化方面,您可以根据自己的想法提出最快的方法,但您无法在实际运行和计时代码以真正回答这个问题。

【讨论】:

  • @assylias 我不同意这一点。理论上的最大值是每个内核只有一个线程可以运行。我将更新以澄清区别。
  • 我明白你的意思 - 我误读了“线程正在运行”并理解了“线程活着”。我同意你的回答。
  • 对动态调整池大小有什么建议吗?
【解决方案2】:

正如 DarthVader 所说,您可以使用 ThreadPool (CachedThreadPool)。使用此构造,您不必指定具体的线程数。

来自oracle 网站:

  • newCachedThreadPool 方法创建一个带有可扩展线程池的执行器。此执行器适用于启动许多短期任务的应用程序。

也许这就是你要找的。 关于核心数量很难说。你有 4 个超线程核心,至少一个核心应该留给你的操作系统。我会说 4-6 线程。

【讨论】:

    猜你喜欢
    • 2015-01-19
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 2018-07-08
    • 2012-07-04
    • 1970-01-01
    相关资源
    最近更新 更多