2013-07-20 15 views
5

コード:子スレッドによって開始されたプロセスを強制終了するにはどうすればいいですか?

main function{ 

Thread t =new Thread(){ 
    public void run(){ 
     Process p= Runtime.getRuntime().exec(my_CMD); 
    } 
}; 
t.start(); 
//Now here, I want to kill(or destroy) the process p. 

私はJavaでこれを行うことができますどのように?私はそれがスレッドにあるので

main function{ 
Process p; 
Thread t =new Thread(){ 
    public void run(){ 
     p= Runtime.getRuntime().exec(my_CMD); 
    } 
}; 
t.start(); 
//Now here, I want to kill(or destroy) the process p. 

のようにクラスのフィールドとしてそれを作る場合は、finalとしてプロセスのPを作るために私に尋ねます。私がそれをfinalにすると、ここで値を割り当てることはできません。 p= Runtime.getRuntime().exec(my_CMD);。 PLZヘルプ。

+1

「編集する」を参照してください。ここでも、p変数はメソッドのローカル変数です。それをしないでください - それをクラスフィールドにしてください。 –

+0

@HovercraftFullOfEelsそれを指摘してくれてありがとう。ちょうどそれがクラスフィールドであると仮定していた。ありがとう –

答えて

3

Process APIには既にこれに対する解決策があります。このプロセスでdestroy()を呼び出すとどうなりましたか?もちろん、上記のコードを変更し、プロセス変数pをクラスフィールドとして宣言したと仮定します。

脇に、Runtime.getRuntime().exec(...)を使用してプロセスを取得するのではなく、ProcessBuilderを使用する必要があります。また、Runnableを実装できるときにはThreadを拡張しないでください。

class Foo { 
    private Process p; 

    Runnable runnable = new Runnable() { 
    public void run() { 
     ProcessBuilder pBuilder = new ProcessBuilder(...); // fill in ...! 
     // swallow or use the process's Streams! 
     p = pBuilder.start(); 
    } 
    } 

    public Foo() { 
    new Thread(runnable).start(); 
    } 
} 
+0

彼は 'run()'の中にProcess変数を定義しました。 't.start()'の後ろではdestroy()を呼び出すために利用できません。 –

+0

@BimaleshJha:あなたのコメントと同期して私の回答を編集しました。スコープの問題ですが、このように外部コードを呼び出していれば、スコープルールを理解していれば、馬の前にカートを置いている可能性があります。 –

+0

高いスコープでは、プロセス変数pを最終宣言しなければならないと思いますか? –

関連する問題