多线程 java 程序阻止 cpu 监控自己的热量

Multi-threaded java program preventing cpu from monitoring its own heat

java 程序是否可以使用所有可用的线程和 CPU 电源以达到 CPU 不再检测到自身热量的程度?

当我偶然发现一个我不知道可以通过 Java 实现的奇怪行为时,我正在做一个以学习为目的的小项目。 为了学习一些关于多线程、线程安全和高效数学计算的知识,我编写了一个快速但肮脏的程序来查找素数。

当我将线程池大小设置为 12 并使用所有线程(6 核 I7 超线程,规格将在下面)时,问题开始了,我发现我的 CPU 没有对自己的温度做出反应上升,直到我再次停止程序时,它才注意到并开始旋转风扇。

涉及的硬件规格:

使用的测量软件:

我进行了一些测试以尝试了解这是什么以及为什么会这样: Ofc 我需要确定这确实发生了,所以我打开了进程管理器 CPU-Z 和 CAM 来监控 CPU 使用情况和热量,果然,当我 运行代码一切似乎都冻结并保持在相同的值(大约 35 C),但是当我停止它时,温度飙升至接近 70C。
只用 10 个线程执行相同的测试,保留 2 个线程不变,风扇随着温度逐渐增加。

这是该程序中的 3 个主要 classes:

线程安全长 public class SyncedLong { 私有长值;

    public SyncedLong(long val){
        this.val = val;
    }

    public synchronized void increment(){
        val++;
    }

    public synchronized long incrementAndGet(){
        val++;
        return val;
    }

    public synchronized long get(){
        return val;
    }
}

我的 ThreadControler class 用于存储和处理活动线程:

public class ThreadControler {

    ArrayList<PrimeCalculatorThread> primePool = new ArrayList<>();
    ExecutorService executor = Executors.newFixedThreadPool(10);

    public void increment() {
        if(executor.isTerminated()){executor = Executors.newFixedThreadPool(12);} //12 is the amount of threads on my cpu
        PrimeCalculatorThread pct = new PrimeCalculatorThread();
        primePool.add(pct);
        executor.execute(pct);

    }

    public void decrement() {
        PrimeCalculatorThread pct = primePool.get(primePool.size()-1);
        pct.terminate();
        primePool.remove(pct);
    }

    public void terminate() {
        for(PrimeCalculatorThread pct : primePool){
            pct.terminate();
        }
        primePool.clear();
        executor.shutdown();
    }
}

最后是数字计算器 PrimeCalculatorThread

public class PrimeCalculatorThread implements Runnable {
    // 77263
    public static SyncedLong threaddedLong = new SyncedLong(0); //Startes a new SyncedLong at starting number 0.
    long currentNumber = 0;
    long lastNumber = 0;
    long a = 0;
    long b = 0;
    long c = 0;
    long startingNumber = 0;
    boolean foundPrime;
    boolean running = true;

    @Override
    public void run() {
        while (running) {
            currentNumber = threaddedLong.incrementAndGet();
            foundPrime = true;

            if (currentNumber % 2 != 0) {
                a = 0;
                while (a <= currentNumber) {
                    b = a;
                    while (b <= currentNumber) {
                        c = a * b;
                        if (a != currentNumber && b != currentNumber) {
                            if (c == currentNumber) {
                                foundPrime = false;

                            }
                        }
                        b++;
                    }
                    a++;
                }
                if (foundPrime) {
                    Output.println("Found prime: " + currentNumber + "    Difference: " + (currentNumber - lastNumber) + "    " + Thread.currentThread().getName());
                    lastNumber = currentNumber;
                }
            }
        }
    }

    public void terminate() {
        running = false;
    }
}

Cpu 用法


英语不是我的母语,所以不要对我的表述和语法过于苛刻,如果您觉得措辞不正确或没有足够的意义(如果有的话),请快速提出一个问题.

现代英特尔技术如此先进。即使您认为您正在同时使用所有内核和线程,但在硬件级别 OS 分配和共享处理器。现在只是为了证明我的事实,尝试在 运行 运行此程序时在后台播放视频,它应该 运行(它可能不流畅)。

处理器内部有防止处理器过热烧毁的技术。首先它会加速风扇然后最终它会关闭系统温度不断升高。

是的,您说对了一部分,FAN 和 cpuz 需要一些时间才能做出反应。但是,如果温度超过一个点,处理器将引发中断并停止所有活动..