0

私はいくつかのRSSフィードを読み、それらを解析し、リンクを別の場所にコピーするプログラムを持っています。上手!RSSフィードを約10分ごとにチェックして更新の可能性を確認したいと思います。私はこのコードを書きました:

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

私がそれを実行するとき、それは1日か2日の間、それは大丈夫で実行しています。しかし、通常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エグゼキュータライブラリを試してください。これらはJava5で導入され、この種のコードをより効率的でクリーンなものにします。

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

これらのライブラリでは多くのことが行われているので、チェックする価値があります。

おそらく、メモリなどの理由で停止しています。上記の方法を試して、10分ごとに確認してください。

これをデバッグするのに役立つ可能性のある例外をスローできるようにする(Runnableの代わりに)Callableの概念もあります。あなたはあなたが助けるために使うことができる未来のオブジェクトを返します。このリンクはかなり良さそうですhttp://www.javacodegeeks.com/2011/09/java-concurrency-tutorial-callable.html

于 2012-08-13T08:04:20.020 に答える