Come interrompere un thread creato implementando l’interfaccia eseguibile?

Ho creato una class implementando un’interfaccia eseguibile e quindi creato molti thread (quasi 10) in qualche altra class del mio progetto.
Come fermare alcuni di questi thread?

Il modo più semplice è interrupt() , che causerà Thread.currentThread().isInterrupted() per restituire true , e può anche lanciare un InterruptedException in determinate circostanze in cui il thread è in attesa , ad esempio Thread.sleep() , otherThread.join() , object.wait() ecc.

All’interno del metodo run() è necessario Thread.currentThread().isInterrupted() tale eccezione e / o controllare regolarmente il valore Thread.currentThread().isInterrupted() e fare qualcosa (ad esempio, Thread.currentThread().isInterrupted() ).

Nota: Sebbene Thread.interrupted() sembri uguale a isInterrupted() , ha un effetto collaterale sgradevole: Calling interrupted() cancella il flag interrupted , mentre isInterrupted() no.

Altri metodi che non interrompono implicano l’uso di flag “stop” ( volatile ) che il thread in esecuzione monitora.

Come interrompere un thread creato implementando l’interfaccia eseguibile?

Ci sono molti modi in cui puoi fermare un thread ma tutti prendono un codice specifico per farlo. Un modo tipico per interrompere un thread è avere un campo di volatile boolean shutdown che il thread controlla ogni tanto:

  // set this to true to stop the thread volatile boolean shutdown = false; ... public void run() { while (!shutdown) { // continue processing } } 

È anche ansible interrompere il thread che causa sleep() , wait() e alcuni altri metodi per lanciare InterruptedException . Dovresti anche verificare il flag di interruzione del thread con qualcosa di simile:

  public void run() { while (!Thread.currentThread().isInterrupted()) { // continue processing try { Thread.sleep(1000); } catch (InterruptedException e) { // good practice Thread.currentThread().interrupt(); return; } } } 

Si noti che l’interruzione di un thread con interrupt() non causa necessariamente il lancio di un’eccezione immediata. Solo se sei in un metodo che è interrompibile verrà lanciata l’ InterruptedException .

Se vuoi aggiungere un metodo shutdown() alla tua class che implementa Runnable , dovresti definire la tua class come:

 public class MyRunnable implements Runnable { private volatile boolean shutdown; public void run() { while (!shutdown) { ... } } public void shutdown() { shutdown = true; } } 

Fermare il filo a metà strada non è una buona pratica. Il modo più appropriato è quello di rendere il thread di ritorno a livello di codice. Lascia che l’object Runnable utilizzi una variabile condivisa nel metodo run() . Ogni volta che vuoi interrompere il thread, usa quella variabile come flag.

EDIT: codice di esempio

 class MyThread implements Runnable{ private Boolean stop = false; public void run(){ while(!stop){ //some business logic } } public Boolean getStop() { return stop; } public void setStop(Boolean stop) { this.stop = stop; } } public class TestStop { public static void main(String[] args){ MyThread myThread = new MyThread(); Thread th = new Thread(myThread); th.start(); //Some logic goes there to decide whether to //stop the thread or not. //This will compell the thread to stop myThread.setStop(true); } } 

Se si utilizza ThreadPoolExecutor e si utilizza il metodo submit () , verrà restituito un Future . È ansible chiamare cancel () sul reso restituito per interrompere l’attività Runnable .

Fermare (uccidere) un filo a metà strada non è raccomandato. L’API è in realtà deprecata.

Tuttavia, è ansible ottenere maggiori dettagli tra cui soluzioni alternative qui: Come si uccide un thread in Java?

Thread.currentThread (). IsInterrupted () funziona in modo superbo. ma questo codice è solo mettere in pausa il timer.

Questo codice è fermo e ripristina il timer del filo. h1 è il nome del gestore. Questo codice è aggiunto all’interno del listener dei clic del pulsante. w_h = minuti w_m = milli sec i = contatore

  i=0; w_h = 0; w_m = 0; textView.setText(String.format("%02d", w_h) + ":" + String.format("%02d", w_m)); hl.removeCallbacksAndMessages(null); Thread.currentThread().isInterrupted(); } }); }`