Java线程堆栈溢出错误
在发生错误之前,它已经运行了大约5分钟: 线程thread-2 java.lang.StackOverflower中出现异常 为什么? 我试过这个:Java线程堆栈溢出错误,java,Java,在发生错误之前,它已经运行了大约5分钟: 线程thread-2 java.lang.StackOverflower中出现异常 为什么? 我试过这个: Thread showWordThread = new Thread() { public void run() { try { sleep(config.delayTime * 1000); } catch (Exception e) {
Thread showWordThread = new Thread() {
public void run() {
try {
sleep(config.delayTime * 1000);
} catch (Exception e) {
System.out.println(e.toString());
}
this.run();
}
};
showWordThread.run();
}
但错误仍然发生。每次运行函数时,函数都会调用自身。
这会导致堆栈溢出。您的函数每次运行时都会调用自身。
这会导致堆栈溢出。可能是因为您调用了run方法this.run from autoself?可能是因为您调用了run方法this.run from autoself?您的代码具有无限递归性,您应该将代码更改为:
Thread showWordThread = new Thread(new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(config.delayTime * 1000);
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
});
showWordThread.start();
您的代码具有无限递归,您应该将代码更改为:
Thread showWordThread = new Thread(new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(config.delayTime * 1000);
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
});
showWordThread.start();
不要在run方法中调用run。这肯定会产生堆栈溢出,因为您继续在没有退出条件的情况下重新输入相同的方法。而是使用while循环
不要在run方法中调用run。这肯定会产生堆栈溢出,因为您继续在没有退出条件的情况下重新输入相同的方法。而是使用while循环
其他人解释说应该使用while循环。您还试图在匿名类声明中调用run方法。此外,您应该调用start,而不是run——当新线程启动时,它将自动调用run。实际上,我建议实现Runnable,而不是扩展线程。所以你想要:
Thread showWordThread = new Thread() {
public void run() {
while(condition) {
try {
sleep(config.delayTime * 1000);
} catch (Exception e) {
System.out.println(e.toString());
}
}
};
showWordThread.start();
}
另一方面,考虑使用OR。
其他人解释说,应该使用while循环来代替。您还试图在匿名类声明中调用run方法。此外,您应该调用start,而不是run——当新线程启动时,它将自动调用run。实际上,我建议实现Runnable,而不是扩展线程。所以你想要:
Thread showWordThread = new Thread() {
public void run() {
while(condition) {
try {
sleep(config.delayTime * 1000);
} catch (Exception e) {
System.out.println(e.toString());
}
}
};
showWordThread.start();
}
可选地,考虑使用OR.
递归调用run方法。Java在堆栈内存中保存调用信息,例如参数,所以当您递归调用一个方法并且没有任何端点时,堆栈内存将被消耗,堆栈溢出异常将抛出
也许您想要增加JVM的堆大小,但这个解决方案不能解决您的问题,并且会发生堆栈溢出 我猜你想要不断地运行线程。我推荐以下代码:Thread showWordThread = new Thread(new Runnable() {
@Override public void run() {
while (someCondition) {
try {
Thread.sleep(config.delayTime * 1000);
// Presumably do something useful here...
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
});
showWordThread.start();
您正在以递归方式调用run方法。Java在堆栈内存中保存调用信息,例如参数,所以当您递归调用一个方法并且没有任何端点时,堆栈内存将被消耗,堆栈溢出异常将抛出
也许您想要增加JVM的堆大小,但这个解决方案不能解决您的问题,并且会发生堆栈溢出
我猜你想要不断地运行线程。我推荐以下代码:
Thread showWordThread = new Thread(new Runnable() {
@Override public void run() {
while (someCondition) {
try {
Thread.sleep(config.delayTime * 1000);
// Presumably do something useful here...
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
});
showWordThread.start();
我现在该怎么办?我想每1分钟运行一次,现在该怎么办?我想每1分钟运行一次。结束时有点不太靠谱-你的run调用应该是start,括号后的分号应该是一个括号。哎呀。盲拷贝/粘贴。谢谢+我给你的答案加了1,因为我还在打字的时候,你就发了同样的邮件;这句话的结尾有点狡猾——你的跑步呼叫应该是start,括号后的分号应该是一个括号。哎哟。盲拷贝/粘贴。谢谢+我给你的答案加了1,因为我还在打字的时候,你就发了同样的邮件;你所说的。快跑,这句话没有任何好的理由!!!我想在每1分钟内用一些东西来称呼它。好吧,我写下了我的答案,我希望它对你有用。你所说的。快跑,这句话没有任何好的理由!!!我想在每1分钟内用一些东西来调用它。好的,我写了我的答案,我希望它对你有用。这仍然是无限递归。但我想在每1分钟内做一些事情minute@Jeffrey,我的错误,忘记删除递归调用。这仍然是无限递归。但是我想在每个1中做一些事情minute@Jeffrey,我的错,忘记删除递归call@hnimnart:如果是相同的错误,那么一定是您没有向我们展示的代码中的错误。上面的代码不会导致堆栈溢出。@hnimnart:所以不是同一个错误:如果是另一个错误,我建议您开始一个新问题。混合使用这两种方法没有意义。@user2910110:请不要使用注释来引起对类似这样的无关问题的注意。@hnimnart:如果是相同的错误,那么一定是在您没有向我们展示的某些代码中。上面的代码不会导致堆栈溢出。@hnimnart:所以不是同一个错误:如果是另一个错误,我建议您开始一个新问题。混合使用这两种方法没有意义。@user2910110:请不要使用注释来引起对此类无关问题的注意。