2013-04-05 17 views
5

Sono stato alla ricerca di modi per uccidere un filo e sembra questo è l'approccio più popolareMetodo alternativo per uccidere filo

public class UsingFlagToShutdownThread extends Thread { 
    private boolean running = true; 
    public void run() { 
    while (running) { 
     System.out.print("."); 
     System.out.flush(); 
     try { 
     Thread.sleep(1000); 
     } catch (InterruptedException ex) {} 
    } 
    System.out.println("Shutting down thread"); 
    } 
    public void shutdown() { 
    running = false; 
    } 
    public static void main(String[] args) 
     throws InterruptedException { 
    UsingFlagToShutdownThread t = new UsingFlagToShutdownThread(); 
    t.start(); 
    Thread.sleep(5000); 
    t.shutdown(); 
    } 
} 

Tuttavia, se nel ciclo mentre noi Spawn un altro un altro oggetto che viene popolata con dati (diciamo una gui che è in esecuzione e in aggiornamento), quindi come richiamiamo - specialmente considerando che questo metodo potrebbe essere stato chiamato più volte quindi abbiamo molti thread con while (in esecuzione), quindi cambiando il flag per uno lo cambierebbe per tutti?

grazie

+4

** Nessun una soluzione, ma una best practice: ** dichiarare la vostra bandiera 'running' come' volatile'. –

+0

L'approccio migliore all'uccisione di thread è non provare. Se esiste un modo in cui è possibile progettare un'applicazione in modo che i thread non debbano essere uccisi fino a quando il sistema operativo non li uccide al termine del processo, è necessario farlo esattamente. –

+0

ma se il metodo di esecuzione ha come ciclo infinito, anche se si chiude il gui il thread sta pompando dati in, non morirà ancora :( – Biscuit128

risposta

2

Un approccio a questi problemi è quello di avere una classe Monitor che gestisce tutti i fili. Può avviare tutti i thread necessari (eventualmente in momenti diversi/quando necessario) e una volta che si desidera arrestare è possibile richiamare un metodo di spegnimento che interrompe tutti (o alcuni) dei thread.

Inoltre, in realtà si chiama un metodo Thread s interrupt() è generalmente un approccio più bello come allora sarà uscire da bloccare azioni che gettano InterruptedException (wait/sonno, per esempio). Poi sarà impostare un flag che è già lì in discussioni (che può essere controllato con isInterrupted() o controllato e cancellato con interrupted() Ad esempio, il seguente codice può sostituire il codice corrente:.

public class UsingFlagToShutdownThread extends Thread { 
    public void run() { 
    while (!isInterrupted()) { 
     System.out.print("."); 
     System.out.flush(); 
     try { 
     Thread.sleep(1000); 
     } catch (InterruptedException ex) { interrupt(); } 
    } 
    System.out.println("Shutting down thread"); 
    } 
    public static void main(String[] args) 
     throws InterruptedException { 
    UsingFlagToShutdownThread t = new UsingFlagToShutdownThread(); 
    t.start(); 
    Thread.sleep(5000); 
    t.interrupt(); 
    } 
} 
+2

Intendi 'while (! isInterrupted()) '? – z5h

+0

Ovviamente, grazie! – ddmps

+1

Questo è il modo consigliato in un libro chiamato' Concurrency in Practice' Java, che è co-autore di progettisti concorrenti JDK (Tim Peierls Joshua Bloch, Joseph Bowbeer, David Holmes e Doug Lea). .stop' è assolutamente depreca ted. –

0

ho aggiunto una classe utlility che essenzialmente aveva una mappa statica e metodi

la mappa era di tipo Long id, Thread thread. Ho aggiunto due metodi uno da aggiungere alla mappa e uno per interrompere il thread tramite l'uso di interrupt.Questo metodo ha preso l'id come parametro.

Ho anche cambiato la logica del loop da mentre vero, anche mentre! isInterrupted. È questo approccio ok o si tratta di un cattivo stile di programmazione/convenzione

grazie

Problemi correlati