2013-07-20 107 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. 

因爲它是在一個線程,它要求我做的方法P爲final。如果我做了這個final,我不能在這裏分配值。 p= Runtime.getRuntime().exec(my_CMD);。 plz幫助。

+1

看到編輯回答。再一次,你的p變量是本地的方法。不要那樣做 - 把它變成一個班級領域。 –

+0

@HovercraftFullOfEels謝謝你指出。只是假定它是一個班級領域。謝謝 –

回答

3

Process API已經有這方面的解決方案。當您嘗試致電destroy()時,發生了什麼情況?當然假設你已經改變了上面的代碼,並且聲明瞭你的Process變量p作爲類字段。

另外,您應該避免使用Runtime.getRuntime().exec(...)來獲得您的Process,而應該使用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必須聲明爲最終的? –