【发布时间】:2012-08-02 17:19:52
【问题描述】:
我的程序分析了大量文档,偶尔会得到一个导致无限循环或很长循环的页面。这是无法提前分析的。我想杀死特定页面并继续下一个(丢弃违规页面的任何结果)。我已阅读 SO 答案 such as this How to stop execution after a certain time in 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
}
和 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() 正常终止的输出似乎正常:
=========== 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包有什么原因吗?
-
是的。无知!请赐教-这就是我来SO的原因。
-
感谢@Boris,这是一篇有用的文章,我学到了很多。
-
@peter.murray.rust 不客气。
标签: java multithreading