比如一个程序中有一个线程,每过30秒统计一次结果,那么这个统计时间点怎么确定?
如:开始时间 time
if(((System.currentTimeMillis()-time)%30000)==0){
。
}
这样可以吗,
但好像程序本身有执行时间 可能在30秒时间点左右 这样也可以 有好的算法吗??
如:开始时间 time
if(((System.currentTimeMillis()-time)%30000)==0){
。
}
这样可以吗,
但好像程序本身有执行时间 可能在30秒时间点左右 这样也可以 有好的算法吗??
可以用System.currentTimeMillis()-time)-30000>0来判断
不知这个答案可以吗?
if((System.currentTimeMillis()-time)>30000){
。
time=System.currentTimeMillis();
}
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的时间就短了。
基本上,避免累计误差都是这么写的