Может ли java проект с работающим модулем, работающим с фиксированной скоростью, остановиться через некоторое время? Шахта продолжает замерзать примерно через 40 часов - PullRequest
2 голосов
/ 06 апреля 2020

После изучения java я начал проект по сбору данных с веб-сайта через API-вызовы для игры под названием Torn. Было несколько небольших деталей, которые я исправил благодаря некоторой помощи, но основная проблема, которую я имел, все еще не решена. после полутора суток работы программа просто зависает. Я ничего не мог найти об этом до сих пор. Я какое-то время брал кучу свалок и заметил некоторые вещи. надеюсь, кто-то может помочь. В первый день или около того все хорошо (скриншот дампа кучи через 3 часа и после 25 часов ). Затем, несколько часов спустя, программа все еще работает, но нет экземпляра метода, который запускает все это ( снимок экрана через 30 часов ). Через несколько часов после этого программа все еще работает (так как она не завершилась или не завершилась), но в ней нет активности и экземпляров методов вообще ( 40 часов до запуска ). (Некоторые изображения могут требовать прокрутки вправо и влево, чтобы увидеть всю информацию). Я также заметил, что после зависания программы поток для запуска изменится с «ожидания по времени» на «ожидание», чего я тоже не понимаю.

Я также включил код для мой проект (за исключением фактического ключа, используемого при подключении к сайту) вместе с изображениями на случай, если это поможет. Главное - в OtherFactionsStats. java.

Я ценю всю помощь и советы - особенно с моим статусом новичка в java - и заранее спасибо.

1 Ответ

2 голосов
/ 06 апреля 2020

Это может произойти, если конструктор RunUpdater выдает исключение RuntimeException.

В соответствии с JavaDo c:

Последовательность выполнения задач продолжается бесконечно, пока не произойдет одно из следующих исключительных завершений:

  • Задача явно отменена через возвращенное будущее.
  • Исполнитель завершается, что также приводит к отмене задачи.
  • выполнение задачи вызывает исключение . В этом случае вызов get для возвращенного будущего вызовет исключение ExecutionException.

Последующие исполнения подавляются. Последующие вызовы isDone () в возвращенном будущем вернут true.

Я бы предложил заменить (в 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(), а затем корректно закроет ваше приложение.

...