【发布时间】:2012-01-08 18:30:35
【问题描述】:
在我正在处理的程序中,我希望用户能够输入他们的处理器拥有的处理线程数,以便程序可以在线程数之间分配工作负载(它正在进行一般计算)用户的电脑有。
或者,有没有一种方法可以让程序检测系统配置以获取线程数而无需询问用户?这会更好,但我不知道是否有办法做到这一点。
这是我唯一能想到的。我知道这是完全不正确的,你不能这样命名一个线程,但我是一个初学者(还在上高中),我只是想包括一些东西来表明我正在尝试。
for(int i = 0; i < threads; i++) {
Thread thread(i) = new Thread(){
public void run() {
double endNum = 0;
for(double numberRun = 0; numberRun <= calcs/threads; numberRun++){
endNum += (num * 999999999);
}
System.out.println("Thread " + i + " complete! The numerical result of the calculation is " + endNum);
}
};
}
每个不确定我在说什么的人,我正在尝试创建计算机拥有的线程数,也就是内核数,或者,如果它使用的是英特尔的超线程,那么内核数是两倍。您可以拥有比系统一次能够执行的线程更多的线程,但我正在尝试做最有效的事情,并将计算总数划分为系统能够同时执行的线程数。我不知道如何让用户定义线程数然后创建该线程数(或者让程序确定系统拥有的线程数然后创建该数)。
【问题讨论】:
-
除非您也将它们固定到核心/HT 上,否则这是没有意义的,但即便如此,您也应该知道,在现代多任务操作系统中,您的线程不会是孤立的,因此在大多数情况下,您让操作系统的调度程序决定运行什么以及何时运行要好得多。它会做得很好,而您无法知道系统中的其他线程在做什么,并且如果您能够将一个线程固定到一个忙于其他事情的核心,则可能会面临性能下降的风险。
-
@Fredrik - 对于 CPU 密集型任务(假设这是机器上唯一或最普遍的任务),您通常不希望运行比 CPU 更多的线程,否则您'只是在制造争用。但是您也不想减少 CPU 的数量,因为您不会使用所有 CPU。 nCPUIntensiveThreads == nProcessors 实际上是一个相当公平的目标。
-
@james 你是对的,你可能不想要比内核更多的线程(除非替代方案是在之后直接运行额外的工作),但以相同数量为目标可能证明同样糟糕除非您独自在系统上或可以控制调度程序。除非您非常清楚您的线程所依赖的内容,否则饿死其他线程很容易损害您在托管环境中的整体性能。对于新手来说,这样的优化很可能会损害性能。
-
我建议使用以 nuber of cores -1 作为池大小的执行器服务。
标签: java multithreading