预定的执行人准确性

时间:2013-03-13 07:02:21

标签: java threadpoolexecutor

我遇到了java中的ScheduledExecutorService问题(几天前我没有遇到这个问题,这对我来说很奇怪)。请找到下面的代码和控制台输出。重复执行任务之间的延迟是1毫秒,所以理想情况下我应该每秒达到1000的计数(给出或花费几毫秒),但这不会发生。请帮忙..

CODE:

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

CONSOLE OUTPUT

1000 13-Mar-2013 14:43:54.477 2000年13月13日 - 2013年14:44:10.296 3000 13-Mar-2013 14:44:26.381 4000 13-Mar-2013 14:44:42.621 5000 13-Mar-2013 14:44:55.907 6000 13-Mar-2013 14:44:58.516 7000 13-Mar-2013 14:45:05.896 8000 13-Mar-2013 14:45:10.292 9000 13-Mar-2013 14:45:15.129 10000 13-Mar-2013 14:45:18.187

谢谢,    阿比纳夫

1 个答案:

答案 0 :(得分:1)

您想使用ScheduledExecutorService#scheduleAtFixedRate而不是ScheduledExecutorService#scheduleWithFixedDelay

如果您使用固定延迟进行计划,则在上次执行完成的时间与下次执行开始的时间之间必须经过1 ms。因此,完成1000次迭代所需的挂钟时间至少为1秒加上千次迭代的执行时间。