139

とScheduledExecutorServicescheduleAtFixedRatescheduleWithFixedDelayメソッドの主な違いは何ですか?

scheduler.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
        System.out.println("scheduleAtFixedRate:    " + new Date());
    }
}, 1, 3L , SECONDS);

scheduler.scheduleWithFixedDelay(new Runnable() {
    @Override
    public void run() {
        System.out.println("scheduleWithFixedDelay: " + new Date());
    }
}, 1, 3L , SECONDS);

それらはまったく同じ時間に印刷され、まったく同じ間隔で実行されているようです。

4

8 に答える 8

234

Thread.sleep(1000);メソッド内に呼び出しを追加してみてください...基本的に、前の実行がいつ終了するかに基づいて何かをスケジュールすることと、(論理的に)開始するrun()ときに何かをスケジュールすることの違いです。

たとえば、1 時間に 1 回の固定レートでアラームが鳴るようにスケジュールを設定し、アラームが鳴るたびに 1 杯のコーヒーを飲んでいるとします。これには 10 分かかります。真夜中に開始するとすると、次のようになります。

00:00: Start making coffee
00:10: Finish making coffee
01:00: Start making coffee
01:10: Finish making coffee
02:00: Start making coffee
02:10: Finish making coffee

1 時間の固定遅延でスケジュールすると、次のようになります。

00:00: Start making coffee
00:10: Finish making coffee
01:10: Start making coffee
01:20: Finish making coffee
02:20: Start making coffee
02:30: Finish making coffee

どちらが必要かは、タスクによって異なります。

于 2014-07-09T09:26:26.183 に答える
69

scheduleAtFixedRate呼び出し方法の時系列を可視化します。最後の実行が期間よりも長くかかる場合、次の実行はすぐに開始されます。それ以外の場合は、一定時間後に開始されます。

scheduleAtFixedRate メソッド呼び出しの時系列

scheduleWithFixedDelay呼び出し方法の時系列。次の実行は、実行時間に関係なく、1 つの実行が終了してから次の実行が開始されるまでの遅延時間後に開始されます。

scheduleWithFixedDelay メソッド呼び出しの時系列

希望はあなたを助けることができます

于 2014-09-08T03:29:58.277 に答える