Wie tötet man einen thread hat eine while(true)?
Ich versuche, zu schließen, alle meine Threads in meiner threadpool.
In der Regel versuche ich:
while(!Thread.currentThread().isInterrupted()) {...
Schließen der while-Schleife...
Aber ich habe einen Thread, die nur aus über
while(!Thread.currentThread().isInterrupted()) {//which is true
Dies ist, wie ich das schließen des threads:
pool.shutdownNow();
So, wie würden Sie schließen so einen Thread?
- "&& wahr" überflüssig ist.
- Sie müssen wissen, exit-Bedingung für diesen thread....
- Nicht Thread.interrupt() für Sie arbeiten?
- wenn Sie die oben genannten while-Schleifen in einer Methode der Klasse, die
extends Thread
verwenden, können Siethis.isInterrupted()
stattThread.currentThread().isInterrupted()
. - Hoffentlich OP nicht verlängern
Thread
. - Die Bedingung wird zu false, wenn Sie anrufen
shutdownNow
, weil diese Methode unterbricht die threads in der Schleife, und die Schleife wird verlassen. Nicht sicher, ob ich Ihre Frage verstehe. - Topolnik: Was wäre daran falsch? Ich lese mehrere tutorials über multithreading in Java, die das getan hat.
- Es ist eine allgemein anerkannte beste Praxis. Einfach bei google nach "java erweitern Thread" zu finden, alles über Sie. Die tutorials sind offensichtlich tun Ihren Lesern einen Bärendienst.
- Selbst die offizielle Dokumentation ist es: docs.oracle.com/javase/7/docs/api/java/lang/Thread.html
- Die offizielle Dokumentation ist es nicht zu empfehlen, aber zu... naja, zu dokumentieren, in diesem Fall die Tatsache, dass es in der Tat zwei Wege, um einen Einstiegspunkt für ein
Thread
Instanz.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie ein
volatile
booleanflag
.Jetzt können Sie nur aufrufen,
Update:
Hilfe von Java-doc von shutdownNow()
Also entweder Sie definieren Ihre Unterbrechung-Richtlinie durch die Erhaltung der interrupts
Thread.interrupt
wird automatisch aufgerufenExecutorService.shutdownNow()
.boolean flag
ist ein weiterer exit-policy für threads. Entweder er hatinterrupt()
Flagge oder andere politische Entscheidung ist OP. Wir sind nicht sicher, warum die Unterbrechung geschluckt wird.Statt, die man vielleicht selbst erstellt Flagge als Bedingung für die while-Schleife.
Nun, um es zu stoppen, rufen Sie einfach an:
Diese lassen den code fertig normalerweise.
volatile
Wenn Sie umgesetzt haben, diese wie Sie Sie beschrieben haben, es sollte einfach funktionieren.
Beim Aufruf
pool.shutdownNow()
es soll zu unterbrechen, alle worker-threads, die derzeit aktiv sind. Unter der Annahme, dass die Anwendung bestimmterun()
Methoden überprüfen Sie die Flagge unterbrochen und beendet sich selbst, wenn Sie es finden, kann Ihr threads sollte Herunterfahren.Es gibt wirklich keine Notwendigkeit zum hinzufügen von einem anderen Mechanismus mit einem ad-hoc - Abbrechen-flag ... oder so.
Übrigens, es gibt ein paar Gründe, warum
interrupt()
ist besser als ad-hoc - Stornierung:sleep
,wait
,join
und einige I/O-Methoden sind empfindlich.Wenn Sie eine
java.util.concurrent
ExecutorService Umsetzung, dann wird es definitiv senden Sie eineinterrupt
signal an alle threads in der thread-pool. Das problem mit deinem rogue Aufgabe kann sein, dass die Schleife nicht in der Tat Durchlaufen, aber Blöcke, die irgendwo im Rahmen, also dieinterrupted
status wird nicht immer überprüft.Noch ein weiteres problem, das Sie haben können: die while-Schleife ausgeführt, einige code, der fängt InterruptedException ohne handling es richtig, effektiv schlucken das interrupt-signal. Dies ist eine gemeinsame Codierung Fehler und in den meisten Fällen, aufgrund der hässliche Wahrheit, dass
InterruptedException
überprüft.