有没有一种安全并立即停止Java中线程执行的方法?特别是,如果实现Runnable
内的run()
方法只执行了单一迭代,并且不定期检查任何告诉它停止的标志?
我正在构建一个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();
现在我的问题是,当用户在GUI中点击“停止”时,如何停止翻译过程(本质上是一个线程)?
我已经阅读了StackOverflow和其他网站上的一些帖子,告诉我在Runnable实现内部有一个易失性布尔标志,我应该从run()方法内部定期检查它,并决定何时停止。请参见此帖子
对我来说,这行不通,因为run()方法只是调用Translator.translate()方法,而Translator.translate()方法本身将需要很长时间。我在这里没有选择。
接下来我读到的是使用ExecutorService并使用其shutDownAll()方法。但即使在这里,我也必须在我的代码中定期处理InterruptedException。这又是不可选的。参考ExecutorService类的此文档。
我知道我不能使用Thread.stop()
,因为它已经被弃用,并且可能会对所有线程常用的对象造成问题。
我有哪些选择?
如果没有对我的设计进行重大更改,我的要求是否真的可行?如果是,请告诉我如何做到。
如果必须更改设计,有谁能告诉我最好的方法是什么?
谢谢, Sriram