我不明白为什么我有4个线程运行,但只使用了处理器容量的50%:实际上这意味着只使用了2/4个处理器。
编辑:我认为这是由于限制:我的错误是5线程同时运行,因此默认情况下系统将%CPU限制为2个核心(50%)。 我要查看4个主题答案 0 :(得分:1)
这在很大程度上取决于你的主题正在做什么。
如果他们正在做的工作主要集中在 IO 操作上,那么你的CPU可以运行许多这样的线程 - 而不会产生任何重大的CPU负载。
换句话说:您的线程很可能不从事CPU密集型工作。
但我们无法确定,因为您不提供有关您的应用程序性质的任何提示。
答案 1 :(得分:0)
首先,它取决于您拥有多少CPU核心 - 如果您拥有的CPU核心数多于运行线程数,那么就没有足够的线程可以将处理器中的所有核心保持在100%的忙碌状态。
另一件事是线程可以处于等待状态,例如。在监视器上等待,在这种情况下,它不消耗CPU周期。
在你的屏幕截图中,池中的一个线程处于MONITOR状态 - 它当时没有执行 - 它正在等待某些事情,因此不会消耗CPU周期。
我认为池中的所有线程都是相似的,并且都具有在监视器上有一些潜在等待的特性 - 这限制了以100%消耗所有CPU核心的可能性。
例如,这个简单的程序应该只消耗100%的所有内核,因为它没有任何等待,但是如果你取消注释命令它睡眠1纳秒Thread.sleep(0, 1);
那么你很难注意任何cpu负载。
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class consumeMaxOfCPU {
public static void main(String[] args) {
int availableProcessors = Runtime.getRuntime().availableProcessors();
// availableProcessors = availableProcessors /2; // uncomment this line to see around half of the load - because there will be less threads than CPU cores.
ExecutorService pool = Executors.newFixedThreadPool(availableProcessors);
for (int n = 0; n < availableProcessors; n++) {
pool.submit(new HeavyTask(n));
}
}
private static class HeavyTask implements Callable<Long> {
private long n;
public HeavyTask(long n) {
this.n = n;
}
@Override
public Long call() throws Exception {
// there are very little chances that this will finish quickly :)
while (n != -10) {
n = n * n;
// Thread.sleep(0, 1); // uncomment this line to see almost no load because of this sleep.
}
return n;
}
}
}