2013-07-20 15 views
5

Codice:Come uccidere un processo avviato da un thread secondario?

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. 

Come posso fare questo in Java? Se faccio come un campo di classe come in

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. 

Dal momento che è in un thread, mi chiede di rendere il processo P come final. Se faccio quello final, non posso assegnare il valore qui. p= Runtime.getRuntime().exec(my_CMD);. aiuto.

+1

vedere la modifica per rispondere. Di nuovo, la tua variabile p è locale rispetto al metodo. Non farlo - rendilo un campo di classe. –

+0

@HovercraftFullOfEels Grazie per avermelo fatto notare. Stavo solo assumendo che fosse un campo di classe. Grazie –

risposta

3

Il Process API ha già una soluzione per questo. Che cosa è successo quando hai provato a chiamare destroy() sul processo? Ovviamente supponendo che tu abbia modificato il codice sopra e dichiarato la tua Variabile di Processo, p, come un campo di classe.

Come parte, dovresti evitare di usare Runtime.getRuntime().exec(...) per ottenere il tuo Processo, ma piuttosto dovresti usare un ProcessBuilder. Inoltre, non estendere Thread quando Runnable può essere implementato.

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

Ha definito la variabile di processo all'interno di 'run()' - non è disponibile all'esterno dopo 't.start()' per chiamare destroy() su di esso. –

+0

@BimaleshJha: ho modificato la mia risposta in modo sincrono con il tuo commento. È semplicemente una questione di scopo, ma se si spera che chiami codice esterno in questo modo, capisce le regole dell'ambito, altrimenti potrebbe mettere il carro davanti ai buoi. –

+0

A un livello più elevato, penso che la variabile di processo p debba essere dichiarata definitiva? –

Problemi correlati