2016-03-23 6 views
2

Я планирую создать поток, который будет вести себя как таймер. Я буду использовать сон, чтобы перезапустить операцию после определенной задержки.
Я волнуюсь, если JVM может внезапно убить мою нить, не закрывая приложение,
Так что если приложение запущено, и эта нить умирает, моя функция не сможет получить новый токен.
Либо мне придется написать некоторую ручную функцию, чтобы перезапустить ее.Может ли JVM убить поток таймера/демона, пока приложение работает (внезапно)?

Так что мой вопрос: может ли JVM внезапно убить любую нить?

Какое оптимальное решение для планирования задачи? Поскольку время выполнения моей задачи наступает во время выполнения, я не могу использовать постоянных исполнителей расписания.

ответ

1

Насколько я знаю, JVM не будет случайным образом убивать любой поток, так как это приведет к неопределенному поведению для всех программ Java. Тем не менее, JVM отключится и уничтожит любой выполняющийся поток, который помечен как поток демона, если нет потока, который не является потоком демона.

Цитируя Thread::setDaemon:

Marks эту нить или как демон нить или нити пользователя. Виртуальная машина Java выходит, когда единственными потоками, запущенными, являются все потоки демона.

Чтобы повторно назначить задачу, вы должны использовать ScheduledExecutorService, когда это возможно. Тот факт, что вы получаете задержку во время выполнения, не мешает вам это делать.

Смотрите также: Invoking a java Timer-Task from the timer thread

1

Так что мой вопрос может Jvm внезапно убить любую тему.

Как правило, это зависит от нити и как она создается и что вы имеете в виду с JVM внезапно убить. JVM информирует всех демонов, когда он выключается. Пожалуйста, обратите внимание на:

, что является лучшим решением для планирования задачи. поскольку время выполнения моей задачи приходит во время выполнения, я не могу использовать фиксированных исполнителей расписания.

В вашем случае я считаю, что лучшим решением является использование предоставленных реализаций. Почему вы не можете использовать ScheduledExecutorService, я не понимаю аргумент runtime. Посмотрите на ответ Стефана Доллазе, потому что он дает больше информации о его использовании.

+0

поэтому я не могу использовать ScheduleExecutor, потому что расписание, которое я получаю, поступает из запланированного потока. поэтому выполнение первого потока будет давать мне график для второго выполнения. Внезапное значение Если в jvm есть из памяти или какой-либо другой ошибки, будет ли она очищать потоки? и может убить мой поток или попытаться его перезапустить? –

+1

Это зависит от того, как отключается JVM. В общем, JVM пытается сделать изящное завершение для всех ваших потоков. Но он отключается только в том случае, если нет потоков не-демона. Если в потоке есть исключение, поток выходит, как и любой другой поток. Посмотрите http://stackoverflow.com/questions/6546193/how-to-catch-an-exception-from-a-thread, если вы хотите знать, как поймать исключения в потоках. – Philipp

0

Смотрите, если это демон нить, она не будет остановлена ​​до тех пор:

  1. Работа дается нить не будет закончена.
  2. Вызывается System.exit().
  3. Если возникает ошибка или исключение.
  4. Если JVM остановлен.

Здесь только третья проблема касается. Чтобы решить эту проблему, используйте try-catch, который ловит Throwable (это поймает все), и в catch вы напишите механизм для повторного запуска функции.

 Смежные вопросы

  • Нет связанных вопросов^_^