如何清理Java中打开的进程?

如何清理Java中打开的进程?,java,destructor,Java,Destructor,我从一个Java程序开始一个进程。我抓住它,在程序的后面,我可能会向它发送一些信号(而不是UNIX信号——一种不同的机制),告诉它清理自己并关闭,这是终止此进程的正确方法。我可能会在以后重新启动并保持该进程,然后再次任意次数地停止它 我希望我的程序在存在时发出终止进程的信号,并确保它存在。否则,由于Java以异步方式启动进程,因此它会持续运行,并在程序终止后继续运行 我想我会在包含流程变量的对象的析构函数中这样做,但Java似乎没有析构函数。它有一个finalize()方法来释放通过JNI分配的

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

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

我想我会在包含流程变量的对象的析构函数中这样做,但Java似乎没有析构函数。它有一个finalize()方法来释放通过JNI分配的内存,但情况并非如此,显然您不能保证finalize()会被调用:它只在对象被垃圾收集时被调用,并且程序可能会一直运行到终止,而不会调用垃圾收集,在这种情况下,将立即释放所有内容,并且不会发生垃圾收集和finalize()

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


<>我看到Java 1.6引入了运行时.AdvutSudiHooCo()方法,但我目前停留在java 1.5上。

尝试/最后是你将得到的最接近C++析构函数的一个java版。
Process process;

process = ....;

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

也……P/>

尝试/最后是你将得到的最接近C++析构函数的一个。

Process process;

process = ....;

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

另外,…

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

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

try/finally在这里不起作用。我的程序根本就不是线性的,而且清理代码永远也不会出现在启动过程的方法中。它必须在用户终止程序时发生,我不知道这是什么时候。然而,指出addShutdownHook()出现在1.3中,这正是我想要的。(并教导我不要假设我在StackOverflow答案中读到的所有内容都是正确的……我从另一个问题中选择了1.6的数字。)谢谢!!你可以让try/finally工作-可能需要一点时间。。。但是很高兴你找到了答案。try/finally在这里不起作用。我的程序根本就不是线性的,而且清理代码永远也不会出现在启动过程的方法中。它必须在用户终止程序时发生,我不知道这是什么时候。然而,指出addShutdownHook()出现在1.3中,这正是我想要的。(并教导我不要假设我在StackOverflow答案中读到的所有内容都是正确的……我从另一个问题中选择了1.6的数字。)谢谢!!你可以让try/finally工作-可能需要一点时间。。。但很高兴你明白了。我很想用这种方式来构造我的代码,但我想我做不到。用户可能会单击X按钮,用户可能会单击“完成”按钮,用户可能会使用操作系统工具终止程序。如果所有这些地方都使用system.exit(),他们难道不能同样轻松地调用静态的.exit例程吗?您定义了一个先关闭资源然后退出的例程吗?我很想用这种方式构造代码,但我想我做不到。用户可能会单击X按钮,用户可能会单击“完成”按钮,用户可能会使用操作系统设施终止程序。如果所有这些地方都使用system.exit(),他们难道不能轻松调用您定义的先关闭资源然后退出的静态.exit例程吗?可能重复的可能重复的