2012-10-21 38 views
5

Eventuali duplicati:
How do you kill a thread in Java?
How to start/stop/restart a thread in Java?Come interrompere un thread Java?

Thread ha le seguenti funzioni:

  • destroy()
  • stop()
  • suspend()

ma sono tutti deprecato.
Che cosa usi per fermare un thread?

+0

Non si interrompe un thread, basta che il metodo 'run' termini l'esecuzione. –

+0

Potresti approfondire il tuo caso d'uso sul perché vuoi interrompere una discussione? – Vikdor

+0

Per completezza, l'altro modo è terminare l'intero processo, che funzionerà. –

risposta

4

È necessario assicurarsi che venga eseguito/chiuso da solo quando è necessario.

Verificare this per la spiegazione.

3

È possibile utilizzare un flag booleano per interrompere il thread. Inoltre è possibile utilizzare Thread.isInterrupted() per verificare se il thread è stato interrotto e ignorare il resto del lavoro come il flag booleano.

class Worker implements Runnable { 
    private volatile boolean shouldRun = true; 

    @Override 
    public void run() { 
     while (shouldRun) { 
      // your code here 
     } 
    } 

    public void cancel() 
    { 
     shouldRun = false; 
    } 
} 

Se si wan per sapere perché queste funzioni sono obsolete è possibile controllare Java Thread Primitive Deprecation

2

Si potrebbe fare così:

private boolean running = true; 

public void stop() { 
    running = false; 
}  

public void run() { 
    while (running) { 
     //your code goes here 
    } 
} 

Questo è solo un modo semplice di lasciare che il run- il metodo semplicemente si estingue.

+1

+1 in esecuzione deve essere 'volatile' altrimenti la corsa() potrebbe non fermarsi mai. –

2

Gli chiedi cortesemente di terminare il suo lavoro. Il thread dovrebbe essere ben educato e dovrebbe terminare il suo lavoro quando richiesto.

Per chiedere all'utente di utilizzare Thread.interrupt() che inserirà InterruptedException (se il thread è in attesa) o imposta un flag nel thread (se non è in attesa).

Il thread deve uscire dal suo lavoro quando prende uno InterruptException o se fa molto un lungo lavoro (senza sleep/wait) dovrebbe controllare di volta in volta se è stato interrotto e uscire in tal caso.

0

I metodi che hai citato sono deprecati perché una volta usati potrebbero portare il sistema a uno stato instabile: è proprio come il processo kill. L'utilizzo di questi metodi non dà al thread alcuna possibilità di uscire con garbo.

La conclusione è che ciascun thread che si sta implementando deve disporre di un proprio meccanismo per l'uscita graduale. Tipicamente fai quanto segue. Crea boolean flag exit ovvero false per impostazione predefinita. Il metodo del filo run() dovrebbe attuare ciclo come:

while (!exit) { 
    // do the job 
} 

Add metodo exit() che trasforma questo flag per true, in modo che quando il metodo viene chiamato dall'esterno filo lascerà il ciclo while alla prossima iterazione.Dovresti preoccuparti di chiudere le risorse ecc quando esci.

Ovviamente è possibile migliorare il meccanismo con l'invio di cantare

0

Qualsiasi filo corre a fare il suo lavoro. Dovrebbe determinarsi se c'è più lavoro da fare. Quando si desidera interrompere un thread di lavoro, questo significa che il thread pensa che il lavoro esista, ma non si vuole che il thread lo faccia. Questo è sicuramente un problema nel tuo design. In un buon problema progettato, non è necessario interrompere/riprendere i thread.

Problemi correlati