终止Java子进程的理想方法是什么? process.destroyForcfully()不会终止我的进程

时间:2018-08-30 06:15:54

标签: java swing process terminate

我有一个创建子进程的Java Swing应用程序。 Swing主应用程序具有一个停止按钮,单击该按钮后应立即终止子流程。 “ process.destroy()”无效。

Process myProcess = new ProcessBuilder("java", "-classpath", System.getProperty("java.class.path"), "MyClass.java");
try {
    myProcess.waitFor();
} 
catch (Exception e) {
    e1.printStackTrace();
}

...

myStopButton.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        myProcess.destroyForcibly(); 
        // myProcess is a really long and complex process. So I could not destroy that using process.destroyForcibly().
    }
}
  1. 我可以向子进程发送一些信号以调用System.exit() 内部?
  2. 我只能使用“ taskkill”杀死子进程吗?

1 个答案:

答案 0 :(得分:1)

这真的取决于您的Java版本。

Java 8之前的版本

public abstract void destroy()
  

杀死子进程。此流程代表的子流程   对象被强制终止。

Java 8

public abstract void destroy()
  

杀死子进程。子流程是否以此为代表   过程对象是否被强制终止或不是实现   依赖。

public Process destroyForcibly()
  

杀死子进程。此流程代表的子流程   对象被强制终止。这个的默认实现   方法调用destroy(),因此可能不会强制终止   处理。此类的具体实现非常有力   鼓励通过兼容的实现重写此方法。   在由以下方法返回的Process对象上调用此方法   ProcessBuilder.start()和Runtime.exec(java.lang.String)将   强制终止该过程。

     

注意:子进程可能不会立即终止。即isAlive()可能   在调用destroyForcably()之后的短时间内返回true。这个   如果需要,可以将该方法链接到waitFor()。

     

返回:强制表示子流程的Process对象   毁了。

Java 9

public abstract void destroy​()
  

终止进程。该流程是否代表该流程   对象通常终止还是不依赖于实现。   强制过程破坏被定义为立即终止   进程,而正常终止则允许进程关闭   干净地下来。如果该过程不存在,则不采取任何措施。的   当进程具有   终止。

public Process destroyForcibly​()
  

强制终止该过程。此流程代表的流程   对象被强制终止。定义了强制过程销毁   作为过程的立即终止,而正常终止   允许进程完全关闭。如果这个过程还没有完成,   不采取任何行动。 onExit()中的CompletableFuture已完成   该过程终止时。

     

在由以下对象返回的Process对象上调用此方法   强制使用ProcessBuilder.start()和Runtime.exec(java.lang.String)   终止该过程。

API注意:

  

该过程可能不会立即终止。即isAlive()可能会返回   在调用destroyForcfully()之后的很短时间内为true。这个方法   如果需要,可以链接到waitFor()。实施要求:   此方法的默认实现会调用destroy(),因此可能   不强行终止该过程。实施说明:具体   强烈建议此类的实现重写此方法   符合标准的方法。

返回:

  

代表被强行破坏的进程的进程对象