Как очистить открытый процесс в Java? - PullRequest
1 голос
/ 07 апреля 2009

Я запускаю процесс из Java-программы. Я держусь за него, и на более поздних этапах программы я могу послать ему несколько сигналов (не так, как в сигналах UNIX - другой механизм), чтобы сказать ему, чтобы он очистился и выключился, что является правильным способом завершения этого процесса. Позже я могу перезапустить и задержать процесс и остановить его снова произвольное количество раз.

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

Я думал, что сделаю это в деструкторе для объекта, который содержит переменную Process, но кажется, что в Java нет деструктора. У него есть метод finalize () для освобождения памяти, выделенной через JNI, но это не тот случай, и, очевидно, вы не можете гарантировать, что будет вызываться finalize (): он вызывается только тогда, когда объект собирается мусором, и программа может завершиться до завершения, даже не вызывая сборщик мусора, в этом случае все освобождается сразу, сбор мусора и финализация () не выполняются.

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

Я вижу, что в Java 1.6 появился метод Runtime.addShutdownHook (), но в настоящее время я застрял на Java 1.5.

Ответы [ 2 ]

3 голосов
/ 07 апреля 2009

Try / finally - самый близкий к вам деструктор C ++.

Process process;

process = ....;

try
{
    // do work
}
finally
{
    // send info to process to shut it down
}

Кроме того, addShutdownHook был добавлен в 1,3 ...

1 голос
/ 07 апреля 2009

Почему бы не позвонить до того, как вы вызовете System.exit? Ваш код, вероятно, должен быть структурирован, так что вы вызываете System.exit только из одного места (или возвращаетесь из основного), в любом случае это будет хороший путь.

...