比如一个程序中有一个线程,每过30秒统计一次结果,那么这个统计时间点怎么确定?
如:开始时间 time
if(((System.currentTimeMillis()-time)%30000)==0){
   。
}
这样可以吗,
但好像程序本身有执行时间 可能在30秒时间点左右 这样也可以 有好的算法吗??

解决方案 »

  1.   

    我只是猜想哈。这样好像不行吧,程序本身的运行,可能使得线程获取的时间分别为29998,30004。这样,不就错过了吗?
    可以用System.currentTimeMillis()-time)-30000>0来判断
    不知这个答案可以吗?
      

  2.   

    time = 0;
    if((System.currentTimeMillis()-time)>30000){
      。
      time=System.currentTimeMillis();
    }
      

  3.   

    首先,获得启动时间,然后处理,然后计算休眠时间public void run(){
        final long interval = 30000; //30秒
        long executeTime = System.currentMilisecond();
        while(true){
            handleYourBusiness();
            long sleepTime = 0;
            do {
                executeTime += interval;
                sleepTime = executeTime - System.currentMilisecond();
            } while(sleepTime > 0);
            Thread.sleep(sleepTime);
         }
    }因为每次时按照理论执行时间计算的时间点,所以即使处理时间有波动,也不会导致下一次执行时间有误差。执行花费的时间长了,sleep的时间就短了。
    基本上,避免累计误差都是这么写的
      

  4.   

    有个小小笔误:while(sleepTime > 0);应该是 while(sleepTime <= 0);