我的程序分析了大量的文檔,偶爾會得到一個導致無限循環或非常長循環的頁面。這不能提前分析。我想殺掉特定頁面並繼續下一頁(扔掉違規頁面的任何結果)。我已經看了這麼回答such as thisHow to stop execution after a certain time in Java?並寫了下面的代碼:停止執行java線程和join()的作用
// 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
}
和Runnable接口叫:
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()
不是主要問題,因爲線程只是繼續前進。
進一步的問題: 我必須在所有runActions()
我希望在不可預測的長期循環的位置插入Thread.currentThread().isInterrupted()
?
是否有原因使用低級線程API而不是java.concurrent包? – assylias 2012-08-05 12:27:55
是的。無知!請賜教 - 這就是我來到這裏的原因。 – 2012-08-05 12:29:03
http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html – 2012-08-05 13:51:30