[英]Java force stop a thread from executing inside a loop cycle
我正在使用HtmlUnit開發應用程序。 像大多數使用HtmlUnit的人都知道的那樣,當啟用Javascript時,加載單個頁面需要一段時間。
我的應用程序包含停止頁面加載的選項,例如完全停止所有加載和操作。
所以我有Executer類:
public class Executer extends Thread {
private Application app;
public Executer(Application app) {
this.app = app;
}
@Override
public void run() {
for (;;)
while (app.isRunning()) {
app.execute();
}
}
}
基本上這是我的執行線程,它在每個周期調用app.execute()
。
因此execute
方法會處理很多HtmlUnit訂單,例如getPage()
因此htmlunit會加載新頁面等。
如果用戶單擊“停止”按鈕,然后“停止”按鈕將isRunning的布爾值更改為false,則線程顯然不會停止在execute()
方法內部execute()
因為尚未執行完。
我需要找出一種方法來強制線程執行任何操作。
我發現的一個解決方案是使用executer.stop()
它基本上停止了線程正在執行的所有操作,但是我不贊成使用.stop
因為它只是停止了所有操作,並且某些對象可能被鎖定並導致問題。
在這種情況下我可以使用什么解決方案?
如果您不想使用Thread.Stop()
,則必須在execute()
- app.isRunning()
實現特殊代碼,該代碼還將檢查app.isRunning()
- app.isRunning()
。
恐怕沒有其他方法可以停止execute()
Method。
編輯:
如此處所述,使用thread.stop();
應該小心使用!
基本上你不能。 這是有原因的-如果線程在執行的任何指令上終止,java都無法確保應用程序狀態不會被破壞。
例如:
try(InputStream in = openStream()){ readStreamContent(in); }
如果java在執行readStreamContent()
期間終止線程, readStreamContent()
該流將永遠不會關閉。
另一個例子:
mutex.acquire(); try { doSomething(); } finally { mutex.release(); }
如果我們在doSomething()
終止線程,則永遠不會釋放mutex
。 這可能會使許多線程掛在永遠不會釋放的互斥鎖上。
只需通過調用將Executor
實例的isInterrupted
標志設置為true
executor.interrupt()
這是停止線程的最安全方法。 當您加載頁面時,線程不會主動等待,因此,如果在等待服務器響應時該線程被中斷,執行器實際上將立即停止。 您的Application.isRunning()
也不需要,因為isInterrupted
標志的作用完全相同。
編輯:永遠不要使用Thread.stop()來停止線程。 它的行為可能變得不可預測,並且將來如果發生某些意外行為,將很難調試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.