Java 计算线程池中可用于提高性能的最大线程数

Java 计算线程池中可用于提高性能的最大线程数,java,multithreading,Java,Multithreading,最近我面临着一次面试,面试官问我你们能分配给线程池的最大线程数是多少。我回答他这将取决于硬件组合。 我还可以通过增加线程池中的线程来手动测试执行 他似乎对此不满意 有人能告诉我们如何决定为了获得更好的性能应该使用的最大线程数吗。任何指导链接(在核心java应用程序中)都将受到欢迎。有人能告诉我们如何决定为了获得更好的性能应该使用的最大线程数吗?-这绝对不是最大线程数 为了获得最佳性能,线程数量应等于处理器内核的数量(不要忘记使用-xmsyyyyym和-XmxYYYYM,如果没有它们,处理器可能无

最近我面临着一次面试,面试官问我你们能分配给线程池的最大线程数是多少。我回答他这将取决于硬件组合。 我还可以通过增加线程池中的线程来手动测试执行

他似乎对此不满意


有人能告诉我们如何决定为了获得更好的性能应该使用的最大线程数吗。任何指导链接(在核心java应用程序中)都将受到欢迎。

有人能告诉我们如何决定为了获得更好的性能应该使用的最大线程数吗?-这绝对不是最大线程数

为了获得最佳性能,线程数量应等于处理器内核的数量(不要忘记使用-xmsyyyyym-XmxYYYYM,如果没有它们,处理器可能无法为内核分配线程)

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

cat /proc/sys/kernel/threads-max
已编辑。

您可以使用整数.MAX\u值创建线程池

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

我运行的代码:

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);
    }
  }
}
package com.stackoverflow.test;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
公共类TestMaxAmountOfThreads{
公共静态void main(字符串[]args){
ExecutorService serivce=Executors.newFixedThreadPool(整数.MAX_值);
对于(int i=0;i
输出:

31850

线程“main”java.lang.OutOfMemoryError中出现异常:无法 在java.lang.thread.start0(本机方法)创建新的本机线程 在java.lang.Thread.start(Thread.java:714)的 java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:949) 在 java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1360) 在 提交(AbstractExecutorService.java:110) 在 TestMaxAmountOfThreads.main(TestMaxAmountOfThreads.java:10)


因此,我只能使用31850线程,而无需jvm调优。

ThreadPoolExecutor
类构造函数定义如下-:

public ThreadPoolExecutor(int corePoolSize,**int maximumPoolSize**,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
public ThreadPoolExecutor(int-corePoolSize,**int-maximumPoolSize**,long-keepAliveTime,TimeUnit,BlockingQueue-workQueue,ThreadFactory-ThreadFactory,RejectedExecutionHandler)
您可以将整数的最大值(
integer.MAX\u value
)指定给maximumPoolSize。将线程池大小设置得太大可能会导致性能问题。如果同时执行太多线程,任务切换开销将成为一个重要因素

计算线程池中可用于提高性能的最大线程数

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

一方面,如果您的程序是,那么运行线程的数量不应该高于CPU内核的数量。一些英特尔处理器有一个“超线程”特性,所以你应该考虑禁用超线程。p> 另一方面,如果您的程序不受CPU限制,而是完全受CPU限制,则线程数不应超过可用内核数的2到3倍。如果您有8个内核,那么IO绑定程序的线程数不应超过24个

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


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

“有人能告诉我们如何决定为了获得更好的性能应该使用的最大线程数吗?”这是一个不同的问题,而且更难回答。您想回答这个句子还是想回答您的标题(和前面的段落)?
ThreadPoolExecutor
的内部状态将线程数限制为2^29-1。在此之前,操作系统和内存很可能成为限制因素。此外,构造函数只接受设置下限的
int
。如果您询问最大线程池可以是什么,那么答案是
Integer.max\u VALUE
。如果你问它应该是什么-答案是基于许多因素,取决于要求等。是@Donal抱歉,如果我写错了。我的问题是,只有如何确定maximumthreadpool,如果他不满意,你应该问他想要什么样的答案。问我们没什么意义。许多这类面试问题实际上是面试官通过不准确的知识或疯狂的理论来炫耀自己的能力,而不是对你的知识进行真正的调查。在这种情况下,我会根据统计排队理论给出一个相当深刻的答案,他可能也不会对此感到满意。如果他真的在问基于
Integer.MAX\u值的答案