2016-10-26 7 views
0

JCIP-から抽象定期的なタスクは、以下の例で完全に4つの呼び出しを「ミス」しますか?

経常TimerTaskをを10ミリ秒ごとに実行するようにスケジュールし、別の TimerTaskを定期的なタスクはどちらか(それは固定で予定されたかどうか に応じて、実行するために40ミリ秒を要している場合レートまたは固定遅延)は、長時間実行されたタスクが完了した後に という名前で4回連続して急速に呼び出されます。 または4回の呼び出しを完全に「逃します」。

私は、最初のタスクが10msごとに実行されるようにスケジュールされているので、40ms以内に4回実行されることを理解します。

しかし、が意味することは、4つの呼び出しが完全に間違っていますか?

+1

あなたはそれが10ms毎に呼び出されることを期待しますが、タイマーが別のタスクで忙しかったときに、ウィンドウのために、それがありました決して呼び出されません。 –

答えて

2

ここではコードの例です:

public static void main(String[] args) throws Exception { 
    final long start = System.currentTimeMillis(); 
    Timer timer = new Timer(); 

    // Schedule a new task that runs at a 10ms interval and stars immediately 
    timer.schedule(new TimerTask() { 
     @Override 
     public void run() { 
      System.out.println("10ms delayed task ran at " + (System.currentTimeMillis() - start)); 
     } 
    }, 0, 10); 

    // Schedule a task to start in 50ms that takes 40ms to run. 
    // It cancels itself so it's only run once. 
    timer.schedule(new TimerTask() { 
     @Override 
     public void run() { 
      System.out.println("slow task ran at " + (System.currentTimeMillis() - start)); 
      try { 
       Thread.sleep(40); 
      } catch (InterruptedException e) { 

      } 
      this.cancel(); 
     } 
    }, 50, 10); 

    // Wait 100 ms for the demo to end, then stop the timer. 
    Thread.sleep(100); 
    timer.cancel(); 
} 

出力:

10ms delayed task ran at 1 
10ms delayed task ran at 11 
10ms delayed task ran at 22 
10ms delayed task ran at 32 
10ms delayed task ran at 42 
slow task ran at 52 
10ms delayed task ran at 92 
1

したがって、2つのタスクがあります。タスク10は10msごとに実行されるようにスケジュールされ、タスク2は40msで実行されます。

のは、時間0で言ってみましょう、タスク二つは、実行を開始し、その後すぐに、タスクの一つがトリガーされます。

0.0:タスク2

0.1を実行します。タスク1タスク2がまだ実行して、トリガ。

10.1:タスク1まだタスク1

20.1を実行しているタスク2、トリガーはまだタスク1

30.1を実行しているタスク2、トリガー依然として

40.0を実行しているタスク2トリガ:タスク2が終了すると、タスク1が実行を開始します。

タスク2が開始されてからタスク2が終了するまでに、タスク1が実行されずに4回トリガされました。 また、タスク1は4回トリガされたが、実行するチャンスを得られなかったため、連続して4回連続して実行されます。

+0

これは、スレッドが1つしかないため、タスク2で占有されたときに、タスク1がトリガーされてもタスク1を見逃したことを意味します。 –

+0

@ ShirgillFarhanAnsari複数のスレッドがある場合でも、複数のCPUを持っていない限り、一度に1つしか実行できません。したがって、タスク2のスレッドがタスク1のスレッドよりも高い優先度を持つ場合、マルチスレッド環境でも同じことが起こる可能性があります。 – iheanyi

+0

いいえ、実際はそうではありません。スレッドの処理は、オペレーティングシステムによって行われ、タスクを別々にスライスし、それらを同時に動作させることができます。そうしなければ、Javaやどこにも並行性を持たせることはできません。 – RealSkeptic