我的程序相当大,因为它往往会随机执行进程,有时它会卡住并永远循环。如果我强行停止并手动重启程序,通常(大约85%)的时间,程序完成所有命令并终止。
有没有办法让Java程序在20秒之后自动重启,如果它被卡住了?我尝试使用系统时间来解决问题,但问题是如果我的程序卡在for循环中,它不会更新系统时间直到下一次迭代。
答案 0 :(得分:7)
这不是解决此问题的正确方法!您需要弄清楚为什么您的程序陷入无限循环,然后修复它。 “好吧,让我们再试一次”不是解决错误的正确方法 - 你不知道这个bug可能带来的其他影响。你很可能也会得到不正确的输出。调试程序,不要解决这个缺陷。
你可以使用一些启动java程序的外部程序,在它被卡住20秒后将其杀死,然后再次启动它,但是再次,这不是解决问题的正确方法。
答案 1 :(得分:1)
你的程序不应该卡住并永远循环,修复它。但如果这是不可能的,你仍然希望在永久循环之后“重启”程序,我建议你这样的解决方案:
创建将成为导演的主程序。导演将创建线程。线程将执行主算法,这可能需要很长时间。导演将等待一段时间,这将是最终参数。这个参数帮助导演识别线程是否处于永久循环中(这需要很长时间)。当永久循环被识别时,它将终止线程并启动新线程(重启)。
答案 2 :(得分:1)
查看ExecutorServices以获取一种机制,允许您调用一段代码并在预期时间内未完成时接收超时。然后你可以按照自己的意愿采取行动。
另一个不错的工具是在循环中使用JDK中的jvisualvm附加到程序。然后,您可以请求线程转储并使用它来弄清楚它正在做什么。
答案 3 :(得分:1)
考虑到解决这个问题意味着解决停机问题,我们可以相当确定整个方法注定要失败;)
显然,你可以在一些指定的时间之后使用计时器来杀死程序,但是真的 - 找到程序中的错误。