Что такое чистый / рекомендуемый способ завершить работу постоянно работающего Java-приложения из командной строки? - PullRequest
3 голосов
/ 09 января 2012

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

Очевидный способ прекратить это действие - нажать Control-C, но затем янеобходимо установить в виртуальной машине крюк отключения и обработать все потоки.

Есть ли более приятный / более подходящий способ информировать пользователя о том, что пора завершать работу?

ДляНапример, есть ли способ захватить какую-то другую комбинацию клавиш и установить логический флаг в моем приложении?

В качестве дальнейшего пояснения я ищу что-то функционально похожее на обработку сигналов в C.

Ответы [ 4 ]

2 голосов
/ 09 января 2012

Одним из способов может быть создание нового потока, который будет «слушать» стандартный ввод.В зависимости от того, какую комбинацию клавиш вы выберете, этот поток может установить флаг в основном приложении.

1 голос
/ 09 января 2012

Рассмотрите возможность использования крюка отключения следующим образом:

Runtime.getRuntime().addShutdownHook(shutdownHook);

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

  1. Программа завершается нормально, например, когда завершается последний поток, не являющийся демоном, или когда вызывается метод Runtime.exit ().
  2. Виртуальная машина завершается в ответ на пользовательское прерывание, такое как ввод CTRL-C, или общесистемное событие, такое как выход пользователя из системы или завершение работы системы (например, JVM получает один из сигналов прерывания SIGHUP ( Только для Unix), SIGINT или SIGTERM).

Вы можете обратиться к: http://www.ibm.com/developerworks/ibm/library/i-signalhandling/ для получения более подробной информации (Отказ от ответственности: очень старая статья относится к JDK 1.3.1)

1 голос
/ 09 января 2012

Есть ли более приятный / более подходящий способ сообщить пользователю, что пора завершать работу?

Наилучший способ - использовать Мониторинг и управление Java

Посмотрите, например, на этот пост .

Лучше не полагаться на крюк отключения. Отключение в java работает для KILL -15 AND KILLи не работают на KILL -9 ( HARD KILL )

0 голосов
/ 09 января 2012

Это не специфичное для Java решение, но (по крайней мере в Linux) во время завершения работы операционная система отправляет SIGTERM всем процессам (после SIGKILL после льготного периода). Ваше приложение должно установить обработчик для этого и затем корректно завершить работу. Как только вы это сделаете, он автоматически позаботится о себе, когда вы выключите виртуальную машину.

...