[英]cpu usage multithreading java
public class Main {
public static void main(String[] args) {
LinkedList<Th> myThreads = new LinkedList<>();
for (int i = 0; i < 100; i++) {
myThreads.add(new Th());
myThreads.get(i).start();
}
}
}
public class Th extends Thread {
int myInt;
@Override
public void run() {
while(true) {
doSomething();
}
}
private void doSomething() {
switch (myInt) {
case 0: {
// System.out.println("comment part");
break;
}
case 2:{
System.out.println("2");
break;
}
}
}
}
嗨,我在Java中遇到了一个简单的多线程问题。 当我运行该程序时,CPU使用率突然达到100%,我的计算机崩溃了,无法停止该程序。 在这里您可以看到代码。 当我取消评论部分时,一切都OK! 但我需要解决此问题,而无需在控制台中打印任何内容。 PS。 我已经知道案例2的代码块永远不会被编译。
这段代码本身没有错。 这是您的机器无法应付您需要完成的工作量。
您的代码产卵100
线程,它将打印一些东西到标准输出(昂贵的操作,因为你要问的OS这样做) 一样快,因为他们可以 。 即使对于现代机器,这也是很多工作。
打印完消息后,尝试自愿放弃CPU一段时间以增加睡眠。
switch (myInt) {
case 0: {
System.out.println("message");
Thread.sleep(50);
break;
}
另外,拥有100%
的CPU使用率也没有错。 您只是在使用全部可用的计算能力。 这是一件好事,尤其是在科学计算中。
睡个好觉。 只需在打印所在位置调用sleep方法。 您的CPU应当休眠数毫秒,以避免100%消耗它。 在您的情况下,console-io充当睡眠。
尝试减少线程数,并使用循环方法进行计算。
循环(RR)是进程和网络调度程序在计算中使用的算法之一。 正如通常使用的术语一样,将时间片(也称为时间量)以相等的部分并以循环顺序分配给每个过程,从而无优先级地处理所有过程(也称为循环执行)。 参见https://en.wikipedia.org/wiki/Round-robin_scheduling
建议修改:
private void doSomething() {
switch (myInt) {
case 0: {
try {
sleep(100);
} catch (InterruptedException e) {
interrupt();
}
break;
}
case 2:{
System.out.println("2");
break;
}
}
}
您应该调用interrupt方法来重新中断线程。 参考: 为什么在捕获任何InterruptException时调用Thread.currentThread.interrupt()?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.