是否有方法或实用程序来确定程序中可以创建多少个线程,例如使用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;
}
答案 0 :(得分:1)
因此,作为一般规则,创建比您拥有的处理器数量更多的线程并不是很好,因为您可能会在上下文切换之间找到瓶颈。您可以使用可用的availableProcessors()方法找到线程数,如下所示:
numThreads = Runtime.getRuntime().availableProcessors();
executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(numThreads);
这提供了良好的通用可伸缩性,因为所有可用的处理器都将用在您的线程池中。
现在有时,由于大量I / O阻塞或其他因素,您可能会发现将线程数增加到超出可用范围之内可能是有意义的。在这种情况下,你可以将numThreads的结果乘以例如加倍线程池:
executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(numThreads * 2);
我只会在做了一些基准测试后才推荐这个,看看它是否值得。
因此它不是最大理论限制(由底层操作系统决定),但它可能为您提供了利用计算机硬件的现实限制。
希望这有帮助!