Убить работающую банку с очисткой?

Я новичок в мире многопоточности и развертывания кода на сервере. У меня есть проект с основным потоком. Этот основной поток имеет пул из 10 других потоков, которые «запрашивают» различное оборудование с помощью SNMP. Затем эти потоки выполняют некоторые действия с базой данных, и эта база данных переходит к внешнему интерфейсу веб-приложения. Основной поток использует планировщик, чтобы задача выполнялась вечно, и повторяется каждые 15 секунд.

В eclipse я экспортировал исполняемый .jar и запустил его на сервере, используя «nohup java -jar nameOfJar.jar &». Теперь, чтобы убить этот процесс, я использую «ps -ef | grep java», чтобы увидеть, на каком PID работает nameOfJar.jar, и использую «kill PIDofNameOfJar», чтобы фактически убить процесс. Я новичок в многопоточности, и мне интересно, что происходит с потоками, когда я использую команду kill. Проводится ли на них какая-либо чистка? Или у меня должен быть код, чтобы справиться с этим? Или я не должен использовать команду kill, чтобы остановить работающую банку?

Я думаю, что, поскольку я убиваю основной процесс, другие 10 потоков не будут завершены, если они были отправлены, но я не уверен.

Любая помощь будет оценена по достоинству!


person Chris Starling    schedule 19.02.2016    source источник


Ответы (1)


Нет никакой другой очистки, кроме освобождения ресурсов, удерживаемых JVM (так что в основном выделенная память, возможно, сокеты и перехватчики файлов). Любые другие ресурсы (например, фиксация или отмена транзакций БД) должны быть выполнены до этого, поскольку это не произойдет автоматически.

Вы можете подключиться к процессу выключения JVM через Runtime.addshutdownhook(). Этот хук будет выполняться, когда JVM закрывается (а не ненормально, как из-за ошибки JVM), например. когда sigterm отправляется в JVM. Там можно сделать уборку.

person Antoniossss    schedule 19.02.2016