Я пытаюсь добавить поддержку сигналов (особенно для Ctrl + C).Мой инструмент написан на Java, и я хотел бы выполнить очистку, когда Ctrl+C
пойман.Мой основной файл - это Приложение, и в нем есть следующий код:
if (ArgDefinitions.getInstance().hasOption(ArgNames.EXECUTE)) {
performShutdownHooks();
preformRun();
}
Приложение анализирует параметры пользователя и запускает правильный метод.Поэтому, когда пользователь использует опцию execute
и нажимает Ctrl+C
, я бы хотел, чтобы программа остановила и очистила область.Я добавил метод performShutdownHooks
для обработки сигнала, и он выглядит следующим образом:
private void performShutdownHooks() {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
performCleanup();
}
});
}
Он делает то, что я хочу - если я запускаю инструмент и убиваю его во время работы, он выполняет очистку(он запускает специальную команду в фоновом режиме).Проблема возникает, когда я не прекращаю это.Я получаю следующее исключение:
Exception in thread "Thread-2" java.lang.IllegalStateException: Job manager has been shut down.
at org.eclipse.core.internal.jobs.JobManager.schedule(JobManager.java:1104)
at org.eclipse.core.internal.jobs.InternalJob.schedule(InternalJob.java:427)
at org.eclipse.core.runtime.jobs.Job.schedule(Job.java:436)
at glichautil.CommandExecutor.runCommandInBackground(CommandExecutor.java:134)
at glicha.core.Application.performCleanup(Application.java:869)
at glicha.core.Application.access$0(Application.java:838)
at glicha.core.Application$1.run(Application.java:985)
Я думаю, что performShutdownHooks
работает в конце, хотя я не пытался его убить.Может быть, что-то еще убивает это, но это не должно произойти, потому что, если я закомментирую вызов метода performShutdownHooks()
, он будет работать регулярно (без каких-либо исключений).Это заставляет меня поверить, что по какой-то причине метод performShutdownHooks
запускается, хотя я не нажимал Ctrl+C
.Есть ли что-то, что мне нужно добавить в метод performShutdownHooks
, чтобы решить это?Может, я что-то упустил из-за addShutdownHook
?Если это правильное объяснение проблемы, то я думаю, что если бы я мог каким-то образом разобрать его, запустите в конце, то это решило бы проблему.Также возможно, что некоторые другие потоки, используемые в коде, уничтожаются и по какой-то причине выполняют этот метод.
EDIT : я думаю, что мне удалось понять, почему онработает такПрежде чем войти в мой метод ShutdownHooks
, он печатает:
Job found still running after platform shutdown.
Jobs should be canceled by the plugin that scheduled them during shutdown: glicha.testmanager.HandleParallelJobs.
Я думаю, это то, что вызывает ShutdownHooks
.Проблема в том, что я понятия не имею, как ее решить.Я прочитал из документов:
Виртуальная машина Java отключается в ответ на два вида событий:
Программа завершается нормально, когда последний не-deemon поток завершается, или когда вызывается метод выхода (эквивалентно System.exit), или
Виртуальная машина прерывается в ответ на пользовательское прерывание, такое как ввод Ctrl + C или общесистемное событие, такое как выход пользователя из системы или завершение работы системы.
Итак, я предполагаю, что когдаплагин выключается, он вызывает ShutdownHooks
(поправьте меня, если я ошибаюсь).Проблема в том, что я не понимаю, как я могу разделить эти две возможности.Я хотел бы поймать только сигналы и выполнить очистку, но я не хочу делать это, если один из ВМ выключается.Есть идеи, как мне подойти к этому вопросу?