我的程序分析了大量文档,偶尔会得到一个导致无限或很长循环的页面。这是无法提前分析的。我想杀死特定页面并继续下一个(丢弃违规页面的任何结果)。我已经阅读了诸如 如何在 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() 正常终止的输出似乎没问题:
=========== 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()