2

在自学了 java 之后,我开始了一个项目,通过 api 调用从网站获取数据,用于一个名为 torn 的游戏。由于一些帮助,我修复了一些小细节,但我遇到的主要问题仍未解决。运行一天半后,程序就冻结了。到目前为止,我找不到任何关于它的信息。我做了一段时间的堆转储,我注意到了一些事情。希望有人可以提供帮助。在第一天左右,一切都很好(3 小时后和25 小时后堆转储的屏幕截图)。然后,几个小时后,程序仍在运行,但没有运行它的方法的实例(30 小时后的截图)。几个小时后,程序仍在运行(因为它没有终止或退出)但没有任何活动,也没有方法的实例(运行 40 小时)。(某些图像可能需要左右滚动才能查看所有信息)。我还注意到程序冻结后,可运行的线程从“定时等待”变为“等待”,我也不明白。

我还包含了我的项目的代码(减去连接到站点时使用的实际密钥)以及图像以防万一。主要在 OtherFactionsStats.java 中。

我感谢所有的帮助和建议——尤其是我在 java 中的初学者状态——并提前感谢你。

4

1 回答 1

2

如果RunUpdater构造函数抛出 RuntimeException,就会发生这种情况。

根据JavaDoc

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

  • 该任务通过返回的未来显式取消。
  • 执行器终止,也导致任务取消。
  • 任务的执行会引发异常。在这种情况下,在返回的 future 上调用 get 将抛出 ExecutionException。

随后的执行被禁止。在返回的未来上对 isDone() 的后续调用将返回 true。

我建议替换(in OtherFactionStats.main()):

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

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()然后优雅地关闭您的应用程序。

于 2020-04-06T08:44:03.533 回答