Wie tötet man einen java.lang.Thread
in Java?
Antworten
Zu viele Anzeigen?Ich stimme für Thread.stop()
.
Zum Beispiel haben Sie eine lang andauernde Operation (wie eine Netzwerkanfrage). Angeblich warten Sie auf eine Antwort, aber das kann dauern und der Benutzer navigiert zu einer anderen Benutzeroberfläche. Dieser wartende Thread ist nun a) nutzlos b) ein potentielles Problem, denn wenn er das Ergebnis erhält, ist es völlig nutzlos und er wird Rückrufe auslösen, die zu einer Reihe von Fehlern führen können.
All das, und er kann eine Antwortverarbeitung durchführen, die CPU-intensiv sein könnte. Und Sie als Entwickler können es nicht einmal stoppen, denn Sie können nicht einfach die if (Thread.currentThread().isInterrupted())
Zeilen im gesamten Code.
Daher ist es seltsam, dass man einen Thread nicht zwangsweise beenden kann.
Die Frage ist ziemlich vage. Wenn Sie meinten, "wie schreibe ich ein Programm, damit ein Thread aufhört zu laufen, wenn ich es will", dann sollten verschiedene andere Antworten hilfreich sein. Wenn Sie aber meinten: "Ich habe einen Notfall mit einem Server, den ich im Moment nicht neu starten kann, und ich möchte nur, dass ein bestimmter Thread stirbt, komme was wolle", dann brauchen Sie ein Eingriffswerkzeug, das zu Überwachungswerkzeugen wie jstack
.
Zu diesem Zweck habe ich jkillthread . Siehe Gebrauchsanweisung.
Einen Faden abtöten" ist nicht der richtige Ausdruck dafür. Hier ist eine Möglichkeit, wie wir eine geordnete Beendigung/Beendigung des Threads nach Belieben implementieren können:
Runnable, die ich verwendet habe:
class TaskThread implements Runnable {
boolean shouldStop;
public TaskThread(boolean shouldStop) {
this.shouldStop = shouldStop;
}
@Override
public void run() {
System.out.println("Thread has started");
while (!shouldStop) {
// do something
}
System.out.println("Thread has ended");
}
public void stop() {
shouldStop = true;
}
}
Die auslösende Klasse:
public class ThreadStop {
public static void main(String[] args) {
System.out.println("Start");
// Start the thread
TaskThread task = new TaskThread(false);
Thread t = new Thread(task);
t.start();
// Stop the thread
task.stop();
System.out.println("End");
}
}
Es gibt keine Möglichkeit, einen Thread elegant zu beenden.
Sie können versuchen, den Faden zu unterbrechen. Eine gängige Strategie ist die Verwendung einer Giftpille, um den Faden zum Stillstand zu bringen.
public class CancelSupport {
public static class CommandExecutor implements Runnable {
private BlockingQueue<String> queue;
public static final String POISON_PILL = “stopnow”;
public CommandExecutor(BlockingQueue<String> queue) {
this.queue=queue;
}
@Override
public void run() {
boolean stop=false;
while(!stop) {
try {
String command=queue.take();
if(POISON_PILL.equals(command)) {
stop=true;
} else {
// do command
System.out.println(command);
}
} catch (InterruptedException e) {
stop=true;
}
}
System.out.println(“Stopping execution”);
}
}
}
BlockingQueue<String> queue=new LinkedBlockingQueue<String>();
Thread t=new Thread(new CommandExecutor(queue));
queue.put(“hello”);
queue.put(“world”);
t.start();
Thread.sleep(1000);
queue.put(“stopnow”);
Im Allgemeinen beenden, stoppen oder unterbrechen Sie einen Thread nicht (oder prüfen, ob er unterbrochen() ist), sondern lassen ihn auf natürliche Weise enden.
Das ist ganz einfach. Sie können eine beliebige Schleife zusammen mit einer (flüchtigen) booleschen Variable innerhalb der run()-Methode verwenden, um die Aktivität des Threads zu steuern. Sie können auch vom aktiven Thread zum Hauptthread zurückkehren, um ihn zu stoppen.
Auf diese Weise können Sie einen Thread elegant beenden :) .