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%,我的计算机崩溃,我无法停止程序。 在这里你可以看到代码。 当我取消评论评论部分时,一切都很好!但我需要修复此问题,而无需在控制台中打印任何内容。 PS。我已经知道案例2代码块从未编译过。
答案 0 :(得分:4)
此代码本身没有任何错误。 这是你的机器无法应付你需要它完成的工作量。
您的代码会生成100
个线程,这些线程会将某些内容打印到标准输出(代价高昂的操作,因为您必须要求操作系统执行此操作)尽可能快。即使对于现代机器来说,这也是很多工作。
在打印完信息后,尝试自愿放弃CPU一段时间。
switch (myInt) {
case 0: {
System.out.println("message");
Thread.sleep(50);
break;
}
另外,使用100%
使用CPU没有任何问题。您只是使用可用的整个计算能力。这是好事,特别是在科学计算中。
答案 1 :(得分:1)
加入睡眠。只需调用打印方式的睡眠方法即可。 您的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方法重新中断线程。 请参阅:Why invoke Thread.currentThread.interrupt() when catch any InterruptException?