私のプログラムは多数のドキュメントを分析し、無限または非常に長いループを引き起こすページを取得することがあります。これは事前に分析することはできません。特定のページを強制終了して次のページに進みたい(問題のあるページの結果を破棄する)。私はこの ようなSOの答えを読んだことがありますJavaで一定時間後に実行を停止する方法は?そして、次のコードを書きました:
// main program
private void runThread() throws InterruptedException {
long timeout = 15000L;
RunPageAnalyzer runPageAnalyzer = new RunPageAnalyzer(this);
Thread t = new Thread(runPageAnalyzer);
long startTime = System.currentTimeMillis();
t.start();
while (t.isAlive()) {
t.join(1000);
long delta = System.currentTimeMillis() - startTime;
LOG.debug("delta: "+delta);
if (delta > timeout && t.isAlive()) {
t.interrupt();
t.join;
break;
}
}
}
スレッドによって呼び出された同じクラスのメソッド
void runActions() {
// variable length calculation which should be abandoned if too long
}
およびランナブル:
class RunPageAnalyzer implements Runnable {
private PageAnalyzerAction pageAnalyzerAction;
public RunPageAnalyzer(PageAnalyzerAction pageAnalyzerAction) {
this.pageAnalyzerAction = pageAnalyzerAction;
}
public void run() {
try {
pageAnalyzerAction.runActions();
} catch (Exception e) {
LOG.debug("Exception running thread ", e);
}
}
runActions()の通常の終了の出力はOKのようです。
=========== page 1 =============
13863 [main] DEBUG org.xmlcml.graphics.control.page.PageAnalyzerAction - pageActions: 24 on page 0
14863 [main] DEBUG org.xmlcml.graphics.control.page.PageAnalyzerAction - delta: 1000
15864 [main] DEBUG org.xmlcml.graphics.control.page.PageAnalyzerAction - delta: 2001
16864 [main] DEBUG org.xmlcml.graphics.control.page.PageAnalyzerAction - delta: 3001
16975 [main] DEBUG org.xmlcml.graphics.control.page.PageAnalyzerAction - delta: 3112
16975 [main] DEBUG org.xmlcml.graphics.control.page.PageAnalyzerAction - finished page
ただし、制限時間を超えると、プロセスはハングしt.join()
ます。
=========== page 2 =============
16975 [main] DEBUG org.xmlcml.graphics.control.page.PageAnalyzerAction - pageActions: 24 on page 0
17976 [main] DEBUG org.xmlcml.graphics.control.page.PageAnalyzerAction - delta: 1001
18976 [main] DEBUG org.xmlcml.graphics.control.page.PageAnalyzerAction - delta: 2001
// ...
30976 [main] DEBUG org.xmlcml.graphics.control.page.PageAnalyzerAction - delta: 14001
31976 [main] DEBUG org.xmlcml.graphics.control.page.PageAnalyzerAction - delta: 15001
省略したt.join()
場合、プロセスは期待どおりに動作しますが、これが単に膨大な数のスレッドを構築し、後で問題になるのではないかと心配しています。
更新:これまでの回答は、これが自明ではないことを示唆しています(そして、標準のJavaの例/チュートリアルはあまり役に立ちませんでした)。重要な点は、runActions()
中断される可能性があることを明示的に知る必要があるということです。join()
スレッドは継続するため、これは主要な問題ではありません。
さらに質問:予想外に長いループになると予想されるThread.currentThread().isInterrupted()
すべての場所に挿入する必要がありますか?runActions()