2017-08-01 50 views
-2

我创建了一个以java开始和结束进程的类。我尝试mspaint.exe有或没有参数,它启动过程, ,但是当我试图启动计算器(calc.exe)它不起作用。 是否有理由只启动特定的流程?在java中销毁进程

public class XProcess { 

    private Process process; 
    private String cmd; 

    public XProcess(String command) { 
     this.cmd = command; 
    } 
    public synchronized void start() throws IOException{ 
     process = Runtime.getRuntime().exec(this.cmd); 
    } 
    public synchronized void destroy(){ 
     process.destroy(); 
    } 


    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) throws IOException, InterruptedException { 
     XProcess process = new XProcess("mspaint.exe"); 
     process.start(); 
     Thread.sleep(5000); 
     process.destroy(); 
    } 
} 
+1

你有错误吗? –

+3

请改善您的问题质量。你可以在下面找到更多提示:[**我如何提出一个好问题?**](https://stackoverflow.com/help/how-to-ask)和[**如何创建一个最小,完整,和可验证示例**](https://stackoverflow.com/help/mcve)页面。 –

+0

没有收到错误,但似乎没有退出计算器 –

回答

0

您是否使用了最近的Windows? 10或者甚至8? 然后它与Java无关,新的Calculator是一个Windows应用商店应用程序,calc.exe可能只是一个包装器,它在一个新的容器过程中启动它并在此之后存在,当它试图销毁时它就消失了。

2

的进程的destroy()的Javadoc解释它很好地

杀死子进程。此 过程对象所代表的子过程是否被强制终止是依赖的实现 。

通常,试图销毁(或杀死)一个进程是一个请求。操作系统可以拦截请求,或者进程本身可以拒绝请求。

关闭进程的正确方法是在进程内部退出时,父进程(启动子进程的那个进程)监听孩子的退出。其他任何事情都倾向于注意到它是否会在所有情况下都适用于所有流程。

这就是为什么许多进程(Tomcat是一个例子)接受一个关闭命令作为网络请求,所以它可以处理请求,关闭内部。