多线程 java 程序阻止 cpu 监控自己的热量
Multi-threaded java program preventing cpu from monitoring its own heat
java 程序是否可以使用所有可用的线程和 CPU 电源以达到 CPU 不再检测到自身热量的程度?
当我偶然发现一个我不知道可以通过 Java 实现的奇怪行为时,我正在做一个以学习为目的的小项目。
为了学习一些关于多线程、线程安全和高效数学计算的知识,我编写了一个快速但肮脏的程序来查找素数。
当我将线程池大小设置为 12 并使用所有线程(6 核 I7 超线程,规格将在下面)时,问题开始了,我发现我的 CPU 没有对自己的温度做出反应上升,直到我再次停止程序时,它才注意到并开始旋转风扇。
涉及的硬件规格:
- CPU:(6 核,12 线程)I7-5820k,3.3GHz
- 主板:华硕X99-DELUX
- CPU-粉丝:NZXT Kreaken x61
使用的测量软件:
- NZXT CAM
- CPUZ
我进行了一些测试以尝试了解这是什么以及为什么会这样:
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 需要一些时间才能做出反应。但是,如果温度超过一个点,处理器将引发中断并停止所有活动..
java 程序是否可以使用所有可用的线程和 CPU 电源以达到 CPU 不再检测到自身热量的程度?
当我偶然发现一个我不知道可以通过 Java 实现的奇怪行为时,我正在做一个以学习为目的的小项目。 为了学习一些关于多线程、线程安全和高效数学计算的知识,我编写了一个快速但肮脏的程序来查找素数。
当我将线程池大小设置为 12 并使用所有线程(6 核 I7 超线程,规格将在下面)时,问题开始了,我发现我的 CPU 没有对自己的温度做出反应上升,直到我再次停止程序时,它才注意到并开始旋转风扇。
涉及的硬件规格:
- CPU:(6 核,12 线程)I7-5820k,3.3GHz
- 主板:华硕X99-DELUX
- CPU-粉丝:NZXT Kreaken x61
使用的测量软件:
- NZXT CAM
- CPUZ
我进行了一些测试以尝试了解这是什么以及为什么会这样:
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 需要一些时间才能做出反应。但是,如果温度超过一个点,处理器将引发中断并停止所有活动..