gpt4 book ai didi

Java - 如何从 GUI 安全地停止 Web 应用程序中的线程?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:11:21 26 4
gpt4 key购买 nike

有没有一种方法可以安全地立即停止 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com