Wie sollte sich ein Thread in Java schließen?

Lesezeit: 4 Minuten

Benutzer-Avatar
römisch

Dies ist eine kurze Frage. Irgendwann versteht mein Thread, dass es Selbstmord sein soll. Wie geht man am besten vor:

  1. Thread.aktuellerThread().interrupt();
  2. Rückkehr;

Übrigens, warum müssen wir im ersten Fall verwenden currentThread? Ist Thread bezieht sich nicht auf den aktuellen Thread?

Benutzer-Avatar
Enno Shioji

Wenn Sie die kündigen möchten Faden, dann einfach zurückgeben ist in Ordnung. Sie müssen NICHT anrufen Thread.currentThread().interrupt() (Es wird jedoch nichts Schlimmes tun. Es ist nur so, dass Sie es nicht brauchen.) Das liegt daran interrupt() wird im Wesentlichen verwendet, um den Eigentümer des Threads zu benachrichtigen (nun, nicht 100% genau, aber irgendwie). Da Sie der Eigentümer des Threads sind und beschlossen haben, den Thread zu beenden, gibt es niemanden, den Sie benachrichtigen müssen, sodass Sie ihn nicht aufrufen müssen.

Übrigens, warum müssen wir im ersten Fall currentThread verwenden? Bezieht sich Thread nicht auf den aktuellen Thread?

Ja, das tut es nicht. Ich denke, es kann verwirrend sein, weil zB Thread.sleep() den aktuellen Thread beeinflusst, aber Thread.sleep() eine statische Methode ist.

Wenn Sie NICHT der Eigentümer des Threads sind (z. B. wenn Sie nicht verlängert haben Thread und codiert a Runnable usw.) sollten Sie tun

Thread.currentThread().interrupt();
return;

Auf diese Weise weiß jeder Code, der Ihr Runnable aufgerufen hat, dass der Thread unterbrochen ist = (normalerweise) sollte stoppen, was immer er tut, und beenden. Wie ich bereits sagte, ist es jedoch nur ein Kommunikationsmechanismus. Der Eigentümer ignoriert möglicherweise einfach den unterbrochenen Status und unternimmt nichts. Wenn Sie jedoch den unterbrochenen Status festlegen, wird Ihnen vielleicht in Zukunft jemand dafür danken.

Aus dem gleichen Grund sollten Sie dies niemals tun

Catch(InterruptedException ie){
     //ignore
}

Denn wenn Sie dies tun, stoppen Sie die Nachricht dort. Stattdessen sollte man tun

Catch(InterruptedException ie){
    Thread.currentThread().interrupt();//preserve the message
    return;//Stop doing whatever I am doing and terminate
}

  • Letzter Teil: Warum muss ich interrupt aufrufen, wenn der Thread vor Millisekunden unterbrochen wurde? 🙂

    – JacksOnF1re

    28. August 2015 um 19:21 Uhr

  • @JacksOnF1re: Weil Java in seiner unendlichen Weisheit entschieden hat, dass das Unterbrechungsflag wann auf falsch gesetzt wird InterruptedException ist geworfen. Dh wenn man interrupt aufruft, würde der Aufrufer nicht merken das der Thread da unterbrochen ist isInterrupted beginnt, false zurückzugeben.

    – Enno Shioji

    29. August 2015 um 3:09 Uhr

Benutzer-Avatar
Martin Courteaux

Wenn die run-Methode endet, wird der Thread beendet.

Wenn Sie eine Schleife verwenden, ist ein richtiger Weg wie folgt:

// In your imlemented Runnable class:
private volatile boolean running = true;

public void run()
{
   while (running)
   {
      ...
   }
}


public void stopRunning()
{
    running = false;
}

Zurückschicken ist natürlich der beste Weg.

  • @Martijn: Du musst machen running volatile, oder Sie haben einen Parallelitätsfehler.

    – Enno Shioji

    22. März 2010 um 11:14 Uhr

  • @Zwei: Nur wenn Sie es von einem anderen Thread aus signalisieren möchten – in diesem Fall klingt es so, als ob der Thread selbst (irgendwann) weiß, dass er aufhören sollte.

    – Jon Skeet

    22. März 2010 um 11:41 Uhr

  • @Jon: Könnte sein, aber persönlich, unabhängig von der Situation, wenn stopRunning() ist public, halte ich es für sehr gefährlich, ein nichtflüchtiges Flag zu verwenden. Sie können das leicht vergessen, stopRunning() von einem anderen Thread aufrufen und einen wirklich bösen Fehler haben …

    – Enno Shioji

    22. März 2010 um 12:22 Uhr

  • Kann ich die Ausführung durch Einstellung fortsetzen running zu true? Ich möchte es a geben pause Anstatt von termination.

    – Alston

    9. Juli 2014 um 11:59 Uhr


Wenn Sie auf Top-Niveau sind – oder sauber dazu in der Lage sind erhalten auf die oberste Ebene – des Threads, dann ist es schön, einfach zurückzukehren. Das Auslösen einer Ausnahme ist nicht so sauber, da Sie in der Lage sein müssen, zu überprüfen, ob die Ausnahme von nichts abgefangen und ignoriert wird.

Der Grund, den Sie verwenden müssen Thread.currentThread() um anzurufen interrupt() ist das interrupt() ist eine Instanzmethode – Sie müssen sie für den Thread aufrufen, den Sie unterbrechen möchten, was in Ihrem Fall der aktuelle Thread ist. Beachten Sie, dass die Unterbrechung sowieso nur bemerkt wird, wenn der Thread das nächste Mal blockieren würde (z. B. für IO oder für einen Monitor) – dies bedeutet nicht, dass die Ausnahme sofort ausgelöst wird.

  • @Downvoter: Können Sie erklären, was Ihnen an meiner Antwort nicht gefallen hat?

    – Jon Skeet

    22. März 2010 um 11:40 Uhr

Benutzer-Avatar
phil294

Wenn Sie einfach anrufen interrupt(), wird der Thread nicht automatisch geschlossen. Stattdessen könnte der Thread sogar fortsetzen leben, wenn isInterrupted() wird entsprechend umgesetzt. Nur so geht das garantiert nah dran ein Thread, wie von OP gefordert, ist

Thread.currentThread().stop();

Die Methode ist jedoch veraltet.

Berufung return gibt nur von der aktuellen Methode zurück. Dies beendet den Thread nur, wenn Sie sich auf seiner obersten Ebene befinden.

Trotzdem sollte man damit arbeiten interrupt() und bauen Sie Ihren Code darum herum.

Thread ist eine Klasse, keine Instanz; currentThread() ist eine statische Methode, die die Thread-Instanz zurückgibt, die dem aufrufenden Thread entspricht.

Benutze (2). interrupt() ist für den normalen Gebrauch etwas brutal.

1157680cookie-checkWie sollte sich ein Thread in Java schließen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy