Как очистить открытый процесс на Java?

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

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

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

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

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

Ответ 1

Попробуйте/наконец-то, что ближе всего вы получите деструктор С++.

Process process;

process = ....;

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

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

Ответ 2

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