簡體   English   中英

Java強制線程在循環周期內停止執行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM