2017-08-01 7 views
-2

javaでプロセスを開始および終了するクラスを作成しました。私はargsの有無にかかわらず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)と[**最小限の、 Verifiable example **](https://stackoverflow.com/help/mcve)のページを参照してください。 –

+0

エラーは表示されませんが、電卓が終了していないようです –

答えて

0

最新のWindowsを使用していますか? 10、多分8でも? それはJavaとは無関係ですが、新しいCalculatorはWindows Storeアプリケーションです。calc.exeはおそらく新しいコンテナプロセスで起動し、その直後に存在するラッパーで、破棄しようとすると消えてしまいます。

2

プロセスのdestroy()のjavadocは、サブプロセスを強制終了

非常にうまくそれを説明しています。この プロセスオブジェクトによって表されるサブプロセスが強制終了されるかどうかは、実装 に依存します。

一般的に、プロセスを破棄(または強制終了)しようとするのがリクエストです。オペレーティングシステムが要求を傍受する可能性があります。または、プロセス自体が要求を拒否する可能性があります。

プロセスをシャットダウンする適切な方法は、親プロセス(子プロセスを起動したプロセス)が子プロセスの終了を待機しているプロセスを内部的に終了することです。それ以外のものは、すべての場合に、すべてのプロセスで動作するかどうかに関しては不安定な傾向があります。

これは、シャットダウンコマンドをネットワーク要求として受け入れることができる多くのプロセス(Tomcatがその例です)です。そのため、要求を処理して内部的にシャットダウンすることができます。

関連する問題