Java 9的一个新特性是它不仅可以强制杀死它创建的进程(在SIGKILL
的意义上),而且还可以支持发送SIGTERM
(在Java中称为"正常终止")。
根据Process的文档,可以查询实现是否支持:
public boolean supportsNormalTermination()如果是,则返回true destroy()的实现通常是终止进程, 如果强制执行destroy而返回false 立即终止该过程。在Process上调用此方法 ProcessBuilder.start()和。返回的对象 Runtime.exec(java.lang.String)返回true或false,具体取决于 平台实施。
我使用Oracle JRE 9.0.1(Windows 64位)进行了一些测试:
Process p = Runtime.getRuntime().exec("javaw -cp target/classes TestClassWait10Minutes");
p.waitFor(5, TimeUnit.SECONDS);
System.out.println(p.supportsNormalTermination());
然而,似乎Oracle JRE不支持"正常终止"因为我总是得到false
。
因为它取决于"平台实施"似乎Java 9定义了它,但没有实现它。
是否有人知道"正常终止的特征"在任何可用的Java VM中都可以使用吗?
答案 0 :(得分:4)
在Linux实现上,它似乎支持正常终止。来自source of ProcessImpl
:
// Linux platforms support a normal (non-forcible) kill signal.
static final boolean SUPPORTS_NORMAL_TERMINATION = true;
...
@Override
public boolean supportsNormalTermination() {
return ProcessImpl.SUPPORTS_NORMAL_TERMINATION;
}
Windows上的情况并非如此。