如何确定最大可能的固定线程池大小?

时间:2016-10-08 17:22:39

标签: java concurrency

是否有方法或实用程序来确定程序中可以创建多少个线程,例如使用public class ThreadCounter { public static void main(String[] args) { System.out.println("max number threads = " + getMaxNumberThreads()); } static int getMaxNumberThreads() { final int[] maxNumberThreads = {0}; try { while (true) { new Thread(() -> { try { maxNumberThreads[0]++; Thread.sleep(Integer.MAX_VALUE); } catch (InterruptedException e) { } }).start(); } } catch (Throwable t) { } return maxNumberThreads[0]; } } ?以下自定义部署有效,但显然不是企业级解决方案:

     //This method will determine if the player has a pair
     public static int pair(String main)
     {
         int check = 0;
         int card1;
         int card2;

         for(int counter = 1; counter <3; counter++) //error here
         {
             if (card1[counter - 1] == card2[counter])
             {
                 check++;
             }
         }
         if (check == 1)
         {
             return 1;
         }
         else
         {
             return 0;
         }

     }

     //This method will tell the player if he has a high card
     public static int highcard(String main)
     {
         int highcard = 0;
         int card1;
         int card2;

         for (int counter = 0; counter < 3; counter++)
         {
             if (card1[counter] > highcard) // error here
             {
                 highcard = card1[counter]; // error here
             }
         }
         return highcard;    
     }

1 个答案:

答案 0 :(得分:1)

因此,作为一般规则,创建比您拥有的处理器数量更多的线程并不是很好,因为您可能会在上下文切换之间找到瓶颈。您可以使用可用的availableProcessors()方法找到线程数,如下所示:

numThreads = Runtime.getRuntime().availableProcessors();
executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(numThreads);

这提供了良好的通用可伸缩性,因为所有可用的处理器都将用在您的线程池中。

现在有时,由于大量I / O阻塞或其他因素,您可能会发现将线程数增加到超出可用范围之内可能是有意义的。在这种情况下,你可以将numThreads的结果乘以例如加倍线程池:

executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(numThreads * 2);

我只会在做了一些基准测试后才推荐这个,看看它是否值得。

因此它不是最大理论限制(由底层操作系统决定),但它可能为您提供了利用计算机硬件的现实限制。

希望这有帮助!