首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算线程池中可用于更好性能的最大线程数。

计算线程池中可用于更好性能的最大线程数。
EN

Stack Overflow用户
提问于 2014-12-01 09:28:12
回答 3查看 5K关注 0票数 9

最近我面临一个面试,面试官问我什么是你可以分配给线程池的最大线程。我回答说,这将取决于硬件组合。此外,我还可以通过增加线程池中的线程来手动测试执行情况。

他似乎对此不满意。

谁能告诉我们如何决定什么是我们应该使用的最大线程,以获得更好的性能。任何指南链接都将不胜感激(在核心java应用程序中)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-01 09:47:03

可以告诉任何人如何决定我们应该使用的最大线程是什么,以获得更好的性能--这绝对不是线程的最大数量。

为了获得最好的性能,线程的数量应该等于处理器核的(不要忘记使用-XmsYYYYM-XmxYYYYM,没有它们,当处理器没有将线程分配给内核时,您可能会遇到这样的情况)。

关于最大线程,您的答案是正确的,这取决于硬件和操作系统。在linux上,可以检查它:

代码语言:javascript
运行
复制
cat /proc/sys/kernel/threads-max

编辑.

您可以使用Integer.MAX_VALUE创建线程池。

但是您限制了最大线程使用量的。在我的笔记本电脑上。命令"cat /proc/sys/cat/kernel max“显示了126987

我运行的代码:

代码语言:javascript
运行
复制
package com.stackoverflow.test;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestMaxAmountOfThreads {
  public static void main(String[] args) {
    ExecutorService serivce = Executors.newFixedThreadPool(Integer.MAX_VALUE);
    for (int i = 0; i < Integer.MAX_VALUE; i++) {
      serivce.submit(new Runnable() {
        public void run() {
          try {
            Thread.sleep(Integer.MAX_VALUE);
          } catch (InterruptedException e) {
          }
        }
      });
      System.out.println(i);
    }
  }
}

输出:

31850 线程"main“中的异常:无法在java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:949) at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1360) at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:110) at com.stackoverflow.test.TestMaxAmountOfThreads.main(TestMaxAmountOfThreads.java:10)在java.lang.Thread.start(Thread.java:714)的java.lang.Thread.start0(原生方法)创建新的原生线程

因此,我可以只使用31850线程,而不需要调优。

票数 5
EN

Stack Overflow用户

发布于 2014-12-01 10:03:13

ThreadPoolExecutor类构造函数定义如下所示:

代码语言:javascript
运行
复制
public ThreadPoolExecutor(int corePoolSize,**int maximumPoolSize**,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)

可以将整数(Integer.MAX_VALUE)的最大值分配给maximumPoolSize。将线程池大小设置得太大会导致性能问题。如果同时执行的线程太多,则任务切换开销将成为一个重要因素。

票数 0
EN

Stack Overflow用户

发布于 2014-12-01 10:42:56

计算线程池中可用于更好性能的最大线程数。

这个问题的答案完全取决于每个线程将要执行的任务类型。

一方面,如果您的程序是CPU界,那么运行的线程数不应该高于CPU核心的数量。一些英特尔处理器有一个任务的“超线程”功能,所以你应该考虑禁用超线程。

另一方面,如果您的程序不是CPU绑定的,而是完全IO界的,那么线程的数量不应该超过可用内核数量的2或3倍。如果您有8个内核,那么对于一个IO绑定程序,您不应该超过24个线程。

在中间,如果您的线程池需要执行混合CPU绑定和IO绑定操作,则应该使用不同的输出测试和度量性能,并根据具体情况确定一个合理的数目。没有找到具体数字的理论方法,您应该在特定的应用程序上运行一些具体的基准。

当然,这完全取决于您的程序,如果您有一个完全受IO约束的程序,那么我会说,您只使用一个线程,并利用主要平台中可用的非阻塞异步IO API。在Java中,我们有非阻塞IO (NIO)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27225265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档