12

ループ内での Thread.sleep() の呼び出しには問題があり、重大なパフォーマンスの問題であると述べたいくつかのスレッドを読みました。しかし、場合によっては、それが最も自然なことのように思えます。

たとえば、アプリケーションに3 分ごとに何かを実行させたい場合(自動保存だとしましょう)

public void startAutosaveLoop(){
    stop = false;
    new Thread(new Runnable() {

        @Override
        public void run() {
            while (!stop){
                Thread.sleep(T*1000);
                if (!stop){
                    // do something
                }
            }
        }
    }).start();
}

これを行うより良い方法はありますか?このような状況は問題ありますか?

4

2 に答える 2

5

長時間寝ていてもパフォーマンスには影響しません。5 ミリ秒スリープし、何らかの状態を確認し、5 ミリ秒スリープ状態に戻るなど、3 分間の場合、パフォーマンス コストがいくらかかかります。

3 分ごとに何かを実行する必要がある場合は、代わりにスケジューラを使用する方が理にかなっています。

非常によく似た例については、ScheduledExecutorService の javadoc を参照してください。

于 2013-01-28T11:50:27.347 に答える
3

遅延を入れたい場合は、ScheduledExecutorServiceを使用することをお勧めします。このインターフェイスは、タスクの将来および/または定期的な実行をサポートします。

サンプル コードと詳細については、API ドキュメントを確認してください: http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html

于 2013-01-28T11:51:22.023 に答える