- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
有没有一种方法可以安全地立即停止 Java 中线程的执行?特别是,如果 Runnable
实现的 run()
方法中的逻辑只执行一次迭代,并且不定期检查任何标志告诉它停止?
我正在构建一个 Web 应用程序,用户可以使用该应用程序将整个文档的内容从一种语言翻译成另一种语言。
假设文档非常大,随后假设每次翻译都需要很长时间(例如 20-25 分钟),我的应用程序会为其用户启动的每个翻译创建一个单独的线程。用户可以查看 Activity 翻译列表,并根据需要决定停止特定的翻译工作。
这是我的 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
接口(interface),如下所示:
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
实现中有一个 volatile boolean
标志,我应该检查一下在 run()
方法中定期开启并决定何时停止。 See this post
这对我不起作用,因为 run() 方法只是调用 Translator.translate() 方法,这本身将花费很长时间。我别无选择。
我读到的下一件事是使用 ExecutorService
并使用它的 shutDownAll()
方法。但即使在这里,我也必须在代码中的某个地方定期处理 InterruptedException
。这又是不可能的。转介this documentation ExecutorService 类的。
我知道我不能使用 Thread.stop()
,因为它已被弃用,并且可能导致所有线程常用的对象出现问题。
我有哪些选择?
如果不对我的设计进行实质性更改,我的要求真的可行吗?如果是,请告诉我如何。
如果我绝对有必要更改设计,谁能告诉我我可以采取的最佳方法是什么?
谢谢,斯里拉姆
最佳答案
Is there a way to safely and immediately stop the execution of a Thread in Java?
没有。每个线程负责定期检查自己是否被中断尽快退出
if (Thread.currentThread().isInterrupted() ) {
// release resources. finish quickly what it was doing
}
如果您想要一个更具响应性的应用程序,您必须更改逻辑(例如将每个作业分成更小的批处理)以便每个线程比每 20-25 分钟更频繁地执行此检查
关于Java - 如何从 GUI 安全地停止 Web 应用程序中的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44544761/
我是一名优秀的程序员,十分优秀!