具有以固定速率运行的可运行对象的Java项目过一会儿能否停止?约40小时后,矿井保持冻结状态

问题描述 投票:2回答:1

我自己学习了Java之后,我开始了一个项目,该项目通过api调用一个叫做torn的游戏从网站获取数据。在某些帮助下,我修复了一些小细节,但是我遇到的主要问题仍未解决。经过一天半的运行,该程序将冻结。到目前为止,我什么都找不到。我花了一段时间堆堆,我注意到一些事情。希望有人可以帮忙。在第一天左右,一切都很好(3 hours之后和25 hours之后的堆转储的屏幕快照)。然后,几个小时后,程序仍在运行,但是没有方法实例可以全部运行(screenshot after 30 hours)。在此之后的几个小时,该程序仍在运行(因为它尚未终止或退出),但是没有任何活动,也根本没有方法的实例(40 hours into run)。(某些图像可能需要左右滚动才能查看所有信息)。我还注意到,程序冻结后,可运行线程从“定时等待”更改为“等待”,我也不理解。

我还提供了code for my project(减去用于连接该站点的实际密钥)以及图像(如果有帮助的话。主要位于OtherFactionsStats.java中。

我非常感谢所有帮助和建议,尤其是对于我在Java中的初学者身份,并先谢谢您。

java runnable freeze heap-dump thread-state
1个回答
0
投票

如果RunUpdater构造函数抛出RuntimeException,则可能发生。

根据JavaDoc

任务执行的顺序将无限期继续,直到发生以下异常完成之一:

  • 通过返回的future明确取消了该任务。
  • 执行程序终止,也会导致任务取消。
  • 。在这种情况下,在返回的Future上调用get将会抛出ExecutionException。
后续执行将被取消。在返回的future上对isDone()的后续调用将返回true。

我建议替换(在OtherFactionStats.main()中:]

service.scheduleAtFixedRate(runnable, 0, 5, TimeUnit.SECONDS);

with

ScheduledFuture<?> scheduledFuture = service.scheduleAtFixedRate(runnable, 0, 5, TimeUnit.SECONDS); try { scheduledFuture.get(); } catch (InterruptedException e) { System.out.println(e); e.printStackTrace(); } catch (ExecutionException e) { System.out.println(e); e.printStackTrace(); } service.shutdown();

这将打印出在new RunUpdater()期间发生的所有异常,然后正常关闭您的应用程序。
© www.soinside.com 2019 - 2024. All rights reserved.