2012-08-13 65 views
0

我有一个程序来读取一些RSS提要,解析它们,并将链接复制到其他地方。好!我想每隔10分钟检查一次RSS源以获取可能的更新。我写了这段代码:Thread.sleep()不能连续工作

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

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

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

+3

如果线程卡在Thread.sleep中,您可以使用JCONSOLE进行检查。 – 2012-08-13 08:02:35

+1

请考虑使用其中一个[scheduler API](http://docs.oracle.com/javase/tutorial/essential/concurrency/exinter.html)。 – McDowell 2012-08-13 08:07:17

回答

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

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

+1

如果RSS调用引发异常,调度器也将停止运行该任务。 – assylias 2012-08-13 08:33:34