2013-07-20 10 views
5

Kod:Jak zabić proces uruchamiany przez wątek potomny?

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. 

Jak mogę to zrobić w Java? Jeśli zrobię to jako pole klasy jak w

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. 

Ponieważ jest w wątku, to prosi mnie, aby proces P jako final. Jeśli zrobię to final, nie mogę przypisać tutaj wartości. p= Runtime.getRuntime().exec(my_CMD);. plz pomoc.

+1

patrz edytuj, aby odpowiedzieć. Ponownie, twoja zmienna p jest lokalna dla metody. Nie rób tego - uczyń z niego pole klasy. –

+0

@HovercraftFullOfEels Dzięki za wskazanie tego. Właśnie zakładał, że to pole klasy. Dzięki –

Odpowiedz

3

Już ma rozwiązanie tego problemu. Co się stało, gdy próbowałeś dzwonić pod numer destroy() w procesie? Oczywiście zakładając, że zmieniłeś powyższy kod i zadeklarowałeś swoją zmienną Process, p, jako pole klasy.

Na marginesie powinieneś unikać używania Runtime.getRuntime().exec(...), aby uzyskać swój Proces, ale raczej powinieneś użyć ProcessBuilder. Nie rozszerzaj też wątku, gdy można uruchomić Runnable.

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

On zdefiniował zmienną Process wewnątrz 'run()' - nie jest dostępna na zewnątrz po 't.start()', aby wywołać destroy() na niej. –

+0

@BimaleshJha: Zsynchronizowałem moją odpowiedź synchronicznie z Twoim komentarzem. Jest to po prostu kwestia zakresu, ale mam nadzieję, że jeśli w ten sposób wywoła zewnętrzny kod, rozumie zasady ustalania zakresu, w przeciwnym razie może postawić wózek przed koniem. –

+0

Wydaje mi się, że w większym zakresie zmienna procesowa p musi być zadeklarowana jako ostateczna? –