2012-05-17 3 views

Antwort

58

Die einfachste Weg ist, um interrupt() es, die Thread.currentThread().isInterrupted() verursachen true zurückzukehren, und auch eine InterruptedException unter bestimmten Umständen, in denen das Thema werfen kann warten, beispielsweise Thread.sleep(), otherThread.join(), object.wait() usw.

Innerhalb der run() Methode, die Sie c benötigen würden atch diese Ausnahme und/oder regelmäßig den Thread.currentThread().isInterrupted() Wert überprüfen und etwas tun (zum Beispiel ausbrechen).

Hinweis: Obwohl Thread.interrupted() die gleiche wie isInterrupted() scheint, es hat eine unangenehme Nebenwirkung: Aufruf interrupted()löscht die interrupted Flagge, während isInterrupted() Aufruf nicht der Fall ist.

Andere nicht unterbrechende Methoden beinhalten die Verwendung von "stop" (volatile) Flags, die der laufende Thread überwacht.

1

Das Stoppen (Töten) eines Threads in der Mitte wird nicht empfohlen. Die API ist eigentlich veraltet.

Sie können jedoch weitere Details einschließlich Abhilfen hier: How do you kill a thread in Java?

5

Wenn Sie ThreadPoolExecutor verwenden und submit() verwenden, erhalten Sie eine Future zurück. Sie können cancel() auf der zurückgekehrten Zukunft aufrufen, um Ihre Runnable Aufgabe zu stoppen.

+0

Versuche abzubrechen, die Ausführung abzubrechen, aber es ist keine Garantie. – Rohit

6

Stoppen der Thread in der Mitte ist keine gute Übung. Ein geeigneterer Weg besteht darin, den Thread programmgesteuert zurückzugeben. Lassen Sie das Runnable-Objekt eine gemeinsame Variable in der run()-Methode verwenden. Wann immer Sie möchten, dass der Thread beendet wird, verwenden Sie diese Variable als Flag.

EDIT: Beispielcode

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); 
    } 
} 
+0

In meiner Klasse habe ich eine Methode geschrieben, die Flag auf false setzt. Aber ich kann nicht auf diese Methode von der anderen Klasse zugreifen, wo ich den Thread stoppen muss. – svkvvenky

+0

Ist diese _other class_ diejenige, die den Thread startet? – Santosh

+0

ja, du hast recht .... – svkvvenky

28

Wie ein Faden durch die Implementierung runnable Schnittstelle erstellt stoppen?

Es gibt viele Möglichkeiten, wie Sie einen Thread stoppen können, aber alle von ihnen spezifischen Code nehmen, dies zu tun. Ein typischer Weg, um einen Thread zu stoppen, ist ein volatile boolean shutdown Feld zu haben, die die Kontrollen Faden so oft alle:

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

Sie den Faden auch unterbrechen können, die sleep(), wait() verursacht, und einige andere Methoden InterruptedException zu werfen. Sie sollten auch für den Thread Interrupt-Flag-Test mit so etwas wie:

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

Beachten Sie, dass das ein Gewinde mit interrupt() Unterbrechung wird nicht notwendigerweise dazu führen, dass sofort eine Ausnahme zu werfen.Nur wenn Sie sich in einer Methode befinden, die unterbrechbar ist, wird InterruptedException ausgelöst.

Wenn Sie eine shutdown() Methode Ihrer Klasse hinzufügen möchten, die Runnable implementiert, sollten Sie Ihre eigene Klasse wie definieren.

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

In meiner Klasse habe ich eine Methode geschrieben haben, die Flagge (Abschaltung in Ihrem Beispiel) setzt ich bin auf true.But nicht auf dieses Verfahren von der anderen Klasse zuzugreifen, wo ich den Thread beenden müssen. – svkvvenky

+0

Ja, Sie müssen es irgendwie aussetzen. Ich mache normalerweise so etwas wie 'public class MyClass implementiert Runnable {volatile boolean shutdown; public void run() {if (! shutdown) {...}}} '. Sie könnten eine 'shutdown()' Methode hinzufügen, die das shutdown Flag setzt. Dann würden Sie tun 'new Thread (new MyClass()) beginnen (.),' Um es auszuführen. – Gray

0

Thread.currentThread() unterbrochen wird() ist hervorragend arbeiten. aber dieser Code ist nur den Timer pausieren.

Dieser Code wird gestoppt und der Thread-Timer zurückgesetzt. h1 ist der Name des Bearbeiters. Dieser Code ist in Ihrem Button-Klick-Listener hinzugefügt. w_h = Minuten w_m = milli s i = Zähler

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(); 


         } 


        }); 


       }` 
Verwandte Themen