2

私は Java プログラミングの主任です ... 私はスケジューラーを書いています。プロパティ ファイルから日付と時刻の値を読み取っています。プロパティファイルに変更がある場合は、スケジューラを再スケジュールする必要があります..そのため、次のように無限ループを作成しています。

for(;;){
    result = loadData.checkChanges();
    if(result == true){
        //If changes found in the properties file then reSchedule tasks
        reSchedule();
    }
}

「アプリケーション サーバー」でのアプリケーションの寿命 (1 年または 2 年) までループが実行される場合、パフォーマンスの問題または JVM の問題が発生するか、それとも他の問題がありますか?

4

3 に答える 3

3

メソッドがスリープまたはブロックしない限り、現在記述されているコードは、プロセッサが可能な限り高速にcheckChanges()呼び出して CPU をスラッシングします。loadData.checkChanges();理想的には、 callのようなことをしてから、チェックを実行したいときにloadData.wait()別のスレッド呼び出しを行うべきです。loadData.notify()より簡単でほぼ同じくらい良い解決策は、次のようにスレッドを定期的にスリープさせることです。

for(;;){
    result = loadData.checkChanges();
    if(result == true){
        //If changes found in the properties file then reSchedule tasks
        reSchedule();
    }
    try {
        Thread.sleep(100);
    }
    catch (InterruptedException ignored) {}
}

また、使用しないでくださいfor(;;)。代わりに を試しwhile(true)てみてください。または、アプリケーション コンテキストが破棄されたとき (サーバーのシャットダウン、webapp のアンデプロイなど) に true に設定されるブール変数のwhile(!stop)場所を試してみてください。stop

于 2011-06-20T01:59:06.313 に答える
1

これは、ポーリングまたは待機メカニズムなしで無限ループを実行しているため、巨大な CPU ホガーになるでしょう。この種のジョブには Java Executor API を使用することをお勧めします: http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Executor.html

于 2011-06-20T01:58:01.113 に答える
1

すでに述べたように、CPU は最大になります。ただし、ループの最後で一定時間 (たとえば 1 秒) 待機することで、これを簡単に防ぐことができます。

try { Thread.sleep(1000); } catch (InterruptedException ex) {}
于 2011-06-20T02:04:44.337 に答える