scheduleAtFixedRate vs. scheduleWithFixe
scheduleAtFixedRate vs. scheduleWithFixedDelay
1) initialDelay 후에 period 간격으로 command 실행
2) 어떤 이유(예 : garbage collection 또는 기타 백그라운드 활동)로 인해 실행이 지연되면 두 번 이상 실행될 수 있음
ex) scheduleAtFixedRate(command, 1, 2, TimeUnit.SECONDS) 일 때
실행시간이 12시00분00분이면 1초 후인 12시00분01초 command가 실행되고 다음은 12시00분3초, 5초, 7초 ~이다. command의 종료 여부와 관계가 없다. period 주기 정확히 반복한다.
1) initialDelay 후에 delay 간격으로 command 실행
2) command가 종료된 후를 기준으로 delay 간격으로 command 실행
ex) scheduleWithFixedDelay(command, 1, 2, TimeUnit.SECONDS) 일 때
실행시간이 12시00분00분이면 1초 후인 12시00분01초 command가 실행된다. 그 후 command가 10초 후 종료되었다면 다음은 12시00분13초이다. 왜냐하면 command가 소모한 10초의 시간 + delay 시간 2초를 포함한 것이다. 만약 이 다음에 command가 2초 후 종료되었다면 command가 소모한 2초의 시간 + delay 시간 2초로 총 4초 후인 12시00분17초에 다시 실행한다.
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class dailyCode {
public static void main(String[] args) {
final int INTERRUPTER_NUM = 20;
ScheduledExecutorService timer1 = Executors.newSingleThreadScheduledExecutor();
ScheduledExecutorService timer2 = Executors.newSingleThreadScheduledExecutor();
ScheduledExecutorService[] interrupter = new ScheduledExecutorService[INTERRUPTER_NUM];
Date now = new Date();
System.out.println("First TimeStamp : " + new SimpleDateFormat("MM-dd-yyyy / hh:mm:ss").format(now) + "\n");
Runnable timeStamp1 = new Runnable() {
@Override
public void run() {
Date now = new Date();
System.out.println("TimeStamp1 : " + new SimpleDateFormat("MM-dd-yyyy / hh:mm:ss").format(now));
}
};
Runnable timeStamp2 = new Runnable() {
@Override
public void run() {
Date now = new Date();
System.out.println("TimeStamp2 : " + new SimpleDateFormat("MM-dd-yyyy / hh:mm:ss").format(now)+ "\n");
}
};
Runnable interrupt = new Runnable() {
@Override
public void run() {
while(true){
}
}
};
for(int i=0; i<INTERRUPTER_NUM; i++){
interrupter[i] = Executors.newSingleThreadScheduledExecutor();
interrupter[i].execute(interrupt);
}
timer1.scheduleAtFixedRate(timeStamp1, 2, 10, TimeUnit.SECONDS);
timer2.scheduleWithFixedDelay(timeStamp2, 2, 10, TimeUnit.SECONDS);
}
}