2012-08-13 97 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