Gibt es eine Möglichkeit, die Ausführung eines Threads in Java sicher und sofort zu stoppen? Insbesondere wenn die Logik innerhalb der run()
Methode der Runnable
Implementierung führt nur eine einzige Iteration und nicht regelmäßig überprüft für jede Flagge, die es zu stoppen erzählt?Java - Wie kann ich einen Thread in einer Web App über die GUI sicher stoppen?
Ich bin den Aufbau einer Web-Anwendung, mit denen ein Benutzer den Inhalt eines gesamten Dokuments von einer Sprache in eine andere übersetzen kann.
Angenommen, die Dokumente sind extragroß und die Annahme, dass jede Übersetzung sehr lange dauern wird (etwa 20-25 Minuten), erstellt meine Anwendung einen separaten Thread für jede Übersetzung, die von den Benutzern initiiert wird. Ein Benutzer kann eine Liste aktiver Übersetzungen sehen und entscheiden, einen bestimmten Übersetzungsauftrag zu stoppen, wenn er dies wünscht.
Das ist mein Translator.java
public class Translator {
public void translate(File file, String sourceLanguage, String targetLanguage) {
//Translation happens here
//.......
//Translation ends and a new File is created.
}
}
ich eine TranslatorRunnable
Klasse erstellt haben, die die Runnable
-Schnittstelle implementiert, wie folgt:
public class TranslatorRunnable implements Runnable {
private File document;
private String sourceLanguage;
private String targetLanguage;
public TranslatorRunnable(File document, String sourceLanguage, String targetLanguage) {
this.document = document;
this.sourceLanguage = sourceLanguage;
this.targetLanguage = targetLanguage;
}
public void run() {
// TODO Auto-generated method stub
Translator translator = new Translator();
translator.translate(this.document, this.sourceLanguage, this.targetLanguage);
System.out.println("Translator thread is finished.");
}
}
Ich bin für die Übersetzung eines Dokuments aus einer den Faden zu schaffen äußere Klasse wie folgt:
TranslatorRunnable tRunnable = new TranslatorRunnable(document, "ENGLISH", "FRENCH");
Thread t = new Thread(tRunnable);
t.start();
Jetzt Mein Problem ist, wie stoppe ich einen Übersetzungsprozess (im Wesentlichen ein Thread), wenn der Benutzer auf "Stop" in der GUI klickt?
Ich habe ein paar Beiträge auf Stackoverflow sowie auf anderen Seiten, die mir eine volatile boolean
Flagge innerhalb der Runnable
Implementierung haben, sagen zu lesen, die ich aus dem Innern des run()
Verfahren regelmäßig überprüfen sollte und entscheiden, wann zu stoppen. See this post
Dies funktioniert nicht für mich, da die Methode run() nur die Translator.translate() -Methode aufruft, die selbst lange dauern wird. Ich habe hier keine Wahl.
Das nächste, was ich lese, ist ExecutorService
zu verwenden und seine shutDownAll()
Methode zu verwenden. Aber selbst hier würde ich regelmäßig in meinem Code mit InterruptedException
umgehen müssen. Dies ist wieder aus der Option. Erworben this documentation der ExecutorService-Klasse.
Ich weiß, dass ich Thread.stop()
nicht verwenden kann, da es veraltet ist und Probleme mit Objekten verursachen kann, die häufig von allen Threads verwandt werden.
Welche Optionen habe ich?
Ist meine Anforderung ohne wesentliche Änderungen an meinem Design wirklich machbar? Wenn ja, bitte sag mir wie.
Wenn es unbedingt notwendig ist für mich das Design zu ändern, könnte mir jemand sagen, was der beste Ansatz ist, kann ich nehmen?
Danke, Sriram
können Sie t.interrupt() verwenden – Debu