...
Thread showWordThread = new Thread() {
public void run() {
try {
sleep(config.delayTime * 1000);
} catch (Exception e) {
System.out.println(e.toString());
}
this.run();
}
};
showWordThread.run();
}
...
在发生错误之前已经运行了大约5分钟:
线程“Thread-2”中的异常java.lang.StackOverflowError。
为什么?
我试过这个:
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();
但错误仍然存在。
答案 0 :(得分:4)
其他人已经解释过你应该使用while
循环。您还尝试在匿名类声明中调用run
方法。此外,您应该在新线程启动时调用start
而不是run
,它会自动调用run
。我实际上建议实施Runnable
而不是扩展Thread
。所以你想要:
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();
或者,请考虑使用Timer
或ScheduledExecutorService
。
答案 1 :(得分:2)
您正在以递归方式调用run
方法。 Java在堆栈内存中保存调用信息(例如参数),因此当您以递归方式调用方法并且没有任何端点时,将消耗堆栈内存并抛出StackOverflow
异常。
也许您希望增加Heap Size
JVM
,但此解决方案无法解决您的问题并且StackOverflow
将会发生。
我想你想要不断地运行一个线程。我建议使用以下代码:
Thread showWordThread = new Thread()
{
public void run()
{
try
{
sleep(config.delayTime * 1000);
}
catch (Exception e)
{
System.out.println(e.toString());
}
// this.run(); this snnipet code make error
}
};
showWordThread.run();
}
答案 2 :(得分:1)
您的代码具有无限递归,您应该将代码更改为:
Thread showWordThread = new Thread() {
public void run() {
while (true) {
try {
Thread.sleep(config.delayTime * 1000);
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
};
showWordThread.start();
答案 3 :(得分:1)
不要在run()方法中调用run()。这肯定会产生堆栈溢出,因为你保持重新进入相同的方法没有退出条件。而是使用while
循环。
Thread showWordThread = new Thread() {
public void run() {
while(condition) {
try {
sleep(config.delayTime * 1000);
} catch (Exception e) {
System.out.println(e.toString());
}
}
};
showWordThread.start();
}
答案 4 :(得分:0)
每次运行时,您的功能都会自行调用 这会导致堆栈溢出。
答案 5 :(得分:0)
也许是因为您从自己调用了run
方法(this.run()
)?