web-dev-qa-db-ja.com

scheduleAtFixedRateとscheduleWithFixedDelay

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

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);

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

97
Sawyer

Thread.sleep(1000);メソッド内にrun()呼び出しを追加してみてください...基本的には、前回の実行が終了するときといつ(論理的に)starts

たとえば、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

どちらを使用するかは、タスクによって異なります。

168
Jon Skeet

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

time series of invocation scheduleAtFixedRate method

呼び出しの時系列scheduleWithFixedDelayメソッド。次の実行は、実行時間に関係なく、ある実行の終了から次の実行の開始までの遅延時間後に開始されます

time series of invocation scheduleWithFixedDelay method

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

48
Ken Block

ScheduleAtFixedRate()メソッドは、新しいタスクを作成し、毎周期前のタスクが終了したかどうかに関係なくとしてエグゼキューターに送信します。

一方、scheduleAtFixedDelay()メソッドは新しいタスクを作成します前のタスクが終了した後

2
Imar

Java Docを読むと明確になります

ScheduledFuture scheduleAtFixedRate(Runnable command、long initialDelay、long period、TimeUnit unit)指定された初期遅延後に最初に有効になり、その後指定された期間で有効になる定期的なアクションを作成して実行します。つまり、initialDelay、initialDelay + period、initialDelay + 2 * periodなどの後に実行が開始されます。

ScheduledFuture scheduleWithFixedDelay(Runnable command、long initialDelay、long delay、TimeUnit unit)指定された初期遅延後に最初に有効になり、その後1つの実行が終了するまでに指定された遅延で有効になる定期的なアクションを作成して実行しますそして次の開始。

1
shazin

ScheduleAtFixedRateにはキャッチが1つあり、最初のスレッドが長すぎて特定の期間で終了しない場合、最初のタスクが終了すると、2番目の連続したスレッドは開始せず、最初のスレッドがタスクとgievnの継続時間を完了してもすぐには開始されません経過しました。 JVMは、次のタスクがいつ実行されるかを決定します。

私はそれがあなたが方法を選択するのに役立つと思う

1
user1047873
scheduledExecutorService.scheduleAtFixedRate(() -> {
        System.out.println("runnable start"); try { Thread.sleep(5000);  System.out.println("runnable end");} catch
     (InterruptedException e) { // TODO Auto-generated catch block
      e.printStackTrace(); }}, 2, 7, TimeUnit.SECONDS);



     scheduledExecutorService.scheduleWithFixedDelay(() -> {
     System.out.println("runnable start"); try { Thread.sleep(5000); System.out.println("runnable end");} catch
     (InterruptedException e) { // TODO Auto-generated catch block
     e.printStackTrace(); } }, 2, 7, TimeUnit.SECONDS);

実行するだけで、違いがわかります。ありがとうございました

0
logi tech