Java线程堆栈溢出错误

Java线程堆栈溢出错误,java,Java,在发生错误之前,它已经运行了大约5分钟: 线程thread-2 java.lang.StackOverflower中出现异常 为什么? 我试过这个: Thread showWordThread = new Thread() { public void run() { try { sleep(config.delayTime * 1000); } catch (Exception e) {

在发生错误之前,它已经运行了大约5分钟:

线程thread-2 java.lang.StackOverflower中出现异常

为什么?

我试过这个:

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:请不要使用注释来引起对此类无关问题的注意。