Thread.sleep()不能连续工作

时间:2012-08-13 07:55:39

标签: java multithreading performance

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

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

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

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

2 个答案:

答案 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