java程序可以使用所有可用的线程和CPU功率到CPU不再检测自身热量的点吗?
当我偶然发现一个奇怪的行为时,我正在研究一个用于学习目的的小项目。 为了解多线程,线程安全和高效的数学计算,我做了一个快速而又脏的程序来查找素数。
当我将线程池大小设置为12并使用所有线程(6核I7超线程,规格将在下面)时出现问题,我发现我的CPU没有对自己的温度上升作出反应,只有当我停止时该计划再次注意到并开始启动粉丝。
涉及的硬件规格:
使用的测量软件:
我进行了一些测试,试图了解这是什么以及为什么: 我需要确定这是真的发生了,所以我打开了流程管理器,CPU-Z和CAM来监控CPU使用率和热量,果然,当我运行代码时,一切似乎都冻结并保持不变价值(大约35摄氏度左右),但一旦我停下来,温度就会飙升至接近70摄氏度 仅用10个螺纹进行相同的测试,两个胎面保持不变,风扇随着温度逐渐增加。
以下是此计划中的3个主要课程:
线程安全了 公共课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类,用于存储和处理活动线程:
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;
}
}
英语不是我的母语,所以不要过于严厉地判断我的语法和语法,如果你觉得某些内容不正确或者它没有足够的意义(如果有的话),请快速提出一个问题。 / p>
答案 0 :(得分:1)
现代英特尔技术如此先进。即使您认为您同时使用所有内核和线程,在硬件级别操作系统也会分配和共享处理器。现在只是为了证明我的事实是在运行这个程序时尝试在后台播放视频,它应该运行(可能不顺利)。
处理器内部有一项技术可防止处理器因过热而烧坏。首先,它将加速风扇,然后最终将关闭温度系统不断增加。
是的,你是部分正确,FAN和cpuz需要一些时间来作出反应。但是,如果温度超过一个点,处理器将产生一个中断并驱动所有活动..