0

我有一个程序可以读取一些 RSS 提要、解析它们并将链接复制到其他地方。出色地!我想大约每 10 分钟检查一次 RSS 提要以了解可能的更新。我写了这段代码:

   @Override
public void run() {
    while (true) {
        // check feeds here
        try {
            Thread.sleep(600000);
        } catch (InterruptedException ex) {
            // exception handing
        }
    }
}

当我运行它一两天时,它可以正常运行。但通常在 3 或 4 天后,它会进入睡眠状态,再也不会醒来!!!所以它不会更新 RSS 提要。

我该如何解决这个问题!?

4

2 回答 2

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 方法中不太可能存在错误(因为它几乎在任何地方都广泛使用)。无论如何,调试并检查您的线程是否还活着或者它是否已经死亡。

于 2012-08-13T07:59:51.950 回答
8

试试 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

于 2012-08-13T08:04:20.020 回答