1

我正在从 Java 程序启动一个进程。我抓住它,在程序的稍后点,我可能会向它发送一些信号(与 UNIX 信号不同——一种不同的机制),告诉它自己清理并关闭,这是终止这个进程的正确方法。我稍后可能会重新启动并保持该进程并再次停止它任意次数。

我希望我的程序在存在时发出信号终止进程并确保它存在。否则,由于 Java 异步启动进程,它会在我的程序终止后持续存在并继续运行。

我以为我会在包含 Process 变量的对象的析构函数中执行此操作,但似乎 Java 没有析构函数。它有一个用于释放通过 JNI 分配的内存的 finalize() 方法,但情况并非如此,显然你不能保证 finalize() 会被调用:它仅在对象被垃圾回收时调用,并且程序可能会在没有调用垃圾回收的情况下运行到终止,在这种情况下,所有东西都会立即释放,不会发生垃圾回收,也不会发生 finalize()。

确保在我的程序退出时首先调用此清理代码的最佳方法是什么?

我看到 Java 1.6 引入了 Runtime.addShutdownHook() 方法,但我目前停留在 Java 1.5 上。

4

2 回答 2

3

Try/finally 是最接近 C++ 析构函数的方法。

Process process;

process = ....;

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

此外,在 1.3 中添加了 addShutdownHook ...

于 2009-04-07T19:04:59.680 回答
1

为什么不在调用 System.exit 之前调用它?您的代码可能应该是结构化的,因此您只需要从一个地方(或从 main 返回)调用 System.exit,无论哪种方式都是一个好方法。

于 2009-04-07T19:37:04.270 回答