MultiThread和处理器的容量

时间:2017-08-27 18:37:36

标签: java multithreading processor capacity

我不明白为什么我有4个线程运行,但只使用了处理器容量的50%:实际上这意味着只使用了2/4个处理器。

enter image description here

编辑:我认为这是由于限制:我的错误是5线程同时运行,因此默认情况下系统将%CPU限制为2个核心(50%)。 我要查看4个主题

2 个答案:

答案 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;
        }
    }
}