加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 00:44:12 所属栏目:Java 来源:网络整理
导读:最近我面临一个采访,面试官问我什么是你可以分配给线程池的最大线程.我回答他这将取决于硬件组合. 我也可以通过增加线程池中的线程来手动测试执行. 他似乎对此并不满意. 任何人都可以告诉我们如何决定我们应该使用哪些最大线程以获得更好的性能.任何指南链接
最近我面临一个采访,面试官问我什么是你可以分配给线程池的最大线程.我回答他这将取决于硬件组合.
我也可以通过增加线程池中的线程来手动测试执行.

他似乎对此并不满意.

任何人都可以告诉我们如何决定我们应该使用哪些最大线程以获得更好的性能.任何指南链接将不胜感激(在核心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调优.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读