Точность исполнения по расписанию
У меня проблема с 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.129 10000 13 марта 2013 г. 14:45:18.187
Спасибо, абхинав
1 ответ
Вы хотите использовать ScheduledExecutorService#scheduleAtFixedRate
скорее, чем ScheduledExecutorService#scheduleWithFixedDelay
,
Если вы планируете с фиксированной задержкой, то должно пройти 1 мс между временем последнего выполнения и временем начала следующего выполнения. Таким образом, время настенных часов, необходимое для выполнения 1000 итераций, будет составлять как минимум 1 секунду плюс время выполнения тысячи итераций.