Thread.sleep()不能连续工作

Ali*_*emi 0 java performance multithreading

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

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

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

我怎样才能解决这个问题!?

Jor*_*oba 8

如果我不得不猜测我会说代码中可能存在一个错误,它会读取提取未处理异常的提要,这反过来会结束该提示.对你而言,似乎线程永远不会醒来,而事实上它已经死了.

public void run() {
    while (true) {
        // check feeds here   <<<---- Look for the bug here
        try {
            Thread.sleep(600000);
        } catch (InterruptedException ex) {
            // exception handing
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Thread.sleep方法中存在一个错误是非常不可能的(因为它几乎在所有地方都被广泛使用).无论如何,调试并检查您的线程是否仍处于活动状态或是否已经死亡.


RNJ*_*RNJ 7

试试java executor库.它们是在java 5中引入的,它使这种代码更高效,更清晰.

ScheduledExecutorService es = Executors.newScheduledThreadPool(1);
es.schedule(new Runnable(){
    @Override
    public void run() {
        //RSS checking
    }
}, 10, TimeUnit.MINUTES);
Run Code Online (Sandbox Code Playgroud)

这些库中有很多内容,所以值得一试.

也许它因为记忆或类似的东西而停止.尝试上述方法每10分钟检查一次.

还有Callable(而不是Runnable)的概念,它允许抛出可能有助于您调试此异常的异常.您将获得一个可以用来帮助的未来对象.这个链接看起来很不错http://www.javacodegeeks.com/2011/09/java-concurrency-tutorial-callable.html