微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

他似乎对此并不满意.

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

解决方法

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

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

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

cat /proc/sys/kernel/threads-max

编辑.

您可以使用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);
    }
  }
}

输出

31850

Exception in thread “main” java.lang.OutOfMemoryError: unable to
create new native thread at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:714) at
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)

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

原文地址:https://www.jb51.cc/java/129607.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐