1

...

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();

但是仍然出现错误。

4

6 回答 6

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();

或者,考虑使用Timeror ScheduledExecutorService

于 2012-04-22T12:59:17.527 回答
2

您正在run递归调用方法。Java 将调用信息(例如参数)保存在堆栈内存中,因此当您递归调用方法并且没有任何端点时,堆栈内存将被消耗并StackOverflow引发异常。

也许你想增加Heap SizeJVM但这个解决方案不能解决你的问题,并且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();
}
于 2012-04-22T13:10:15.050 回答
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();
于 2012-04-22T12:56:01.057 回答
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();
}
于 2012-04-22T12:57:00.603 回答
0

每次运行时,您的函数都会调用它自己。
这会导致堆栈溢出。

于 2012-04-22T12:55:04.547 回答
0

可能是因为您从自身调用run方法 ( )?this.run()

于 2012-04-22T12:55:07.237 回答