有沒有辦法在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