我有一个程序来读取一些RSS源,解析它们,并将链接复制到其他地方。好!我想大约每10分钟检查RSS提要以获得可能的更新。我写了这段代码:
@Override
public void run() {
while (true) {
// check feeds here
try {
Thread.sleep(600000);
} catch (InterruptedException ex) {
// exception handing
}
}
}
当我运行它一两天时,它就可以运行了。但通常在3或4天后,它会进入睡眠状态并且永远不会再次醒来!所以它不会更新RSS提要。
我该如何解决这个问题!?
答案 0 :(得分:8)
如果我不得不猜测我会说代码中可能存在一个错误,该错误会读取引发未处理异常的代码,这反过来会结束该主题。对你而言,似乎线程永远不会醒来,而事实上它已经死了。
public void run() {
while (true) {
// check feeds here <<<---- Look for the bug here
try {
Thread.sleep(600000);
} catch (InterruptedException ex) {
// exception handing
}
}
}
Thread.sleep方法中存在一个错误的可能性很小(因为它几乎无处不在)。无论如何,调试并检查你的线程是否仍然存在或是否已经死亡。
答案 1 :(得分:7)
尝试java执行器库。它们是在java 5中引入的,它使这种代码更高效,更清晰。
ScheduledExecutorService es = Executors.newScheduledThreadPool(1);
es.schedule(new Runnable(){
@Override
public void run() {
//RSS checking
}
}, 10, TimeUnit.MINUTES);
这些库中有很多内容,所以值得一试。
也许因为记忆或类似事情而停止。尝试上述方法每10分钟检查一次。
还有Callable(而不是Runnable)的概念,它允许抛出可能有助于您调试此异常的异常。您将获得一个可以用来帮助的未来对象。这个链接看起来很不错http://www.javacodegeeks.com/2011/09/java-concurrency-tutorial-callable.html