запланированная точность исполнителя

У меня проблема с ScheduledExecutorService в java (пару дней назад я не сталкивался с этой проблемой, что делает ее странной для меня). Пожалуйста, найдите приведенный ниже код и вывод консоли. Задержка между повторным выполнением задачи составляет 1 мс, поэтому в идеале я должен достигать 1000 каждую секунду (плюс-минус несколько миллисекунд), но этого просто не происходит. Пожалуйста помоги..

КОД:

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;


public class SchedulerTest {

     private static final ScheduledExecutorService executor =       Executors.newScheduledThreadPool(2);
     static DateFormat df= new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss.SSS");

     private static class TestRunnable1 implements Runnable{
         private int count=0;

         @Override
          public void run() {
           count++;
           if(count1 % 1000==0){
              System.out.println(count1+"  "+df.format(Calendar.getInstance().getTime()));
            }

         }
    }


   public static void main(String[] args){
      Runnable localService = new TestRunnable1();
      try{
           executor.scheduleWithFixedDelay(localService, 0, 1, TimeUnit.MILLISECONDS);
         }catch(Exception e){
           e.printStackTrace();
        }
   }
 }

ВЫВОД НА КОНСОЛЬ

1000 13 марта 2013 г. 14:43:54.477 2000 13 марта 2013 г. 14:44:10.296 3000 13 марта 2013 г. 14:44:26.381 4000 13 марта 2013 г. 14:44:42.621 5000 13 марта 2013 г. 14:44:55.907 6000 13 марта 2013 14:44:58.516 7000 13 марта 2013 14:45:05.896 8000 13 марта 2013 14:45:10.292 9000 13 марта 2013 14:45:15.009 14:45:10.0029 13 марта 2013 г. 14:45:18.187

Спасибо, Абхинав.


person user2064123    schedule 13.03.2013    source источник
comment
Это не тот код, который вы используете (не компилируется). Исправление компиляции Я получаю около 1,2-1,3 секунды между каждой печатью, что кажется разумным, если время включает уборку в планировщике. Если я перейду на scheduleAtFixedRate, я получу отпечатки в секунду (по крайней мере, при измерении на миллисекундном уровне).   -  person Roger Lindsjö    schedule 13.03.2013
comment
Спасибо!! ваше предложение сработало :)   -  person user2064123    schedule 13.03.2013


Ответы (1)


Вы хотите использовать ScheduledExecutorService#scheduleAtFixedRate, а не ScheduledExecutorService#scheduleWithFixedDelay.

Если вы планируете с фиксированной задержкой, то между временем завершения последнего выполнения и временем начала следующего выполнения должна пройти 1 мс. Таким образом, время настенных часов, необходимое для выполнения 1000 итераций, будет составлять как минимум 1 секунду плюс время выполнения тысячи итераций.

person Matthew T. Staebler    schedule 13.03.2013
comment
Спасибо, сработало!! Я должен был внимательно прочитать API :) - person user2064123; 13.03.2013