Dies ist eine kurze Frage. Irgendwann versteht mein Thread, dass es Selbstmord sein soll. Wie geht man am besten vor:
Thread.aktuellerThread().interrupt();
Rückkehr;
Übrigens, warum müssen wir im ersten Fall verwenden currentThread? Ist Thread bezieht sich nicht auf den aktuellen Thread?
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
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
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.
11576800cookie-checkWie sollte sich ein Thread in Java schließen?yes