计算可用于在Threadpool中获得更好性能的最大线程数

cor*_*are 7 java multithreading

最近我面临一个采访,面试官问我什么是你可以分配给线程池的最大线程.我回答他这将取决于硬件组合.我也可以通过增加线程池中的线程来手动测试执行.

他似乎对此并不满意.

任何人都可以告诉我们如何决定我们应该使用哪些最大线程以获得更好的性能.任何指南链接将不胜感激(在核心Java应用程序中)

Mak*_*sym 5

任何人都可以告诉我们如何决定我们应该使用哪些最大线程以获得更好的性能 - 它绝对不是最大线程数量.

为获得最佳性能,线程数量应等于处理器核心数量(不要忘记使用-XmsYYYYM-XmxYYYYM,如果没有它们,当处理器未将线程分配给核心时,您可能会遇到这种情况).

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

cat /proc/sys/kernel/threads-max
Run Code Online (Sandbox Code Playgroud)

编辑.

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

但是你限制了最大线程使用量.在我的笔记本上.命令"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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

31850

线程"main"中的异常java.lang.OutOfMemoryError:无法在java.util的java.lang.Thread.start(Thread.java:714)的java.lang.Thread.start0(Native Method)中创建新的本机线程. 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)

所以我只能使用31850线程,没有jvm调优.