有没有办法在Java中安全且立即停止执行Thread?尤其是,如果方法的run()
方法中的逻辑执行只有一次迭代,并且不定期检查任何标志,告诉它停止?Java - 如何从GUI中安全地停止Web应用程序中的线程?
我正在构建一个Web应用程序,使用它可以将整个文档的内容从一种语言翻译成另一种语言。
假设文档非常大,随后假定每个翻译都需要很长时间(比如20-25分钟),我的应用程序会为每个由用户发起的翻译创建一个单独的线程。用户可以看到活动翻译列表,并决定如果他/她希望停止特定的翻译工作。
这是我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.
}
}
我创建了一个TranslatorRunnable
类,如下所示它实现了Runnable
接口:
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.");
}
}
我创建的线程从翻译的文档外部类如下:
TranslatorRunnable tRunnable = new TranslatorRunnable(document, "ENGLISH", "FRENCH");
Thread t = new Thread(tRunnable);
t.start();
Now我的问题是,当用户点击GUI中的“停止”时,如何停止翻译过程(本质上是线程)?
我已阅读StackOverflow上以及在其他网站上的几个帖子,这告诉我有Runnable
实现,这是我应该从run()
方法内部定期检查,并决定何时停止内部volatile boolean
标志。 See this post
这对我不起作用,因为run()方法只是调用Translator.translate()方法,而该方法本身需要很长时间。我在这里没有选择。
我读的下一件事是使用ExecutorService
并使用其shutDownAll()
方法。但即使在这里,我也必须在我的代码中定期处理InterruptedException
。这一点再次超出了选项。涉及ExecutorService类的this documentation。
我知道我不能使用Thread.stop()
,因为它已被弃用,并可能导致所有线程通常使用的对象出现问题。
我有什么选择?
如果我的设计没有实质性改变,我的要求是否真的可行?如果是,请告诉我如何。
如果对我来说改变设计是绝对必要的,谁能告诉我什么是我能采取的最好的方法?
感谢, 斯利拉姆
你可以使用t.interrupt() – Debu